美文网首页
内存对齐分析

内存对齐分析

作者: 深圳_你要的昵称 | 来源:发表于2020-09-08 17:14 被阅读0次

背景

为何需要内存对齐?计算机从内存中读取数据是按照一个固定长度来的,以32位机为例,计算机每次读取内存32位(byte),就是每次读取4个字节(一个字节占8位),以int类型为例,如下图所示:

未对齐时 对齐时

显然,未对齐时,需要读取两次才能将int a读取完全,而对齐时,只需一次,明显提高了效率。当然,内存对齐是会浪费一些空间的,但是这种空间上的浪费却可以减少读取次数,节省了时间,这就是所谓的以空间换时间。计算机采取这种策略必然有它的道理,况且存储器如今越来越便宜,这一点点空间的浪费根本不算什么。

内存对齐原则

1、数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存储。

2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大元素大小的整数倍地址开始存储。(struct a里存有struct b,b里有char int double等元素,那b应该从8的整数倍开始存储。)

3、结构体的总大小,也就是sizeof的结果,必须是其内部最大成员变量的整数倍,不足的要补齐。

请看以下代码:

struct的实际大小是0--17,即18个字节,根据内存对齐原则第一条,以8为倍数补齐,所以是24个字节。

特殊情况:结构体嵌套

struct2的大小是40,why?分析:

1、short a占2字节,地址 0--1;

2、struct1 b占24字节,b的成员中double所占字节最长,为8,按照内存对齐原则第二条,那么struct1 b的首地址应该是8的倍数,从8开始,地址8--31;

3、double c占8字节,从地址32开始,正好32是8的倍数,地址32--39。

0--39,大小正好40。

总结

1、内存对齐是以空间换时间,提高了计算机读取内存的效率。

2、数据成员对齐规则,第一个成员从0开始,后面成员的起始位置是从该成员大小的整数倍位置开始。

3、结构体嵌套情况下,该结构体成员的起始位置,是按照其内部最大成员变量的大小的整数倍位置开始。

附件 - 各种数据结构所占字节大小

 

相关文章

  • 2.iOS底层学习之内存对齐

    学习了内存对齐之后的疑问?? 1.为啥要内存对齐?2.内存对齐的规则?3.内存对齐实例分析。 内存对齐的目的 上网...

  • 结构体内存对齐分析

    这里我们来分析结构体内存对齐方式, 从中我们可以间接的分析出在OC中内存的对齐方式大概什么样. 进行分析前我们要先...

  • 内存对齐分析

    背景 为何需要内存对齐?计算机从内存中读取数据是按照一个固定长度来的,以32位机为例,计算机每次读取内存32位(b...

  • 内存对齐

    本次主要讨论三个问题: 什么是内存对齐 内存对齐的好处 如何对齐 内存对齐 内存对齐是一种提高内存访问速度的策略。...

  • 结构体内存对齐

    对象内存对齐 探讨的问题 1.什么是内存对齐?2.为什么要做内存对齐?3.结构体内存对齐规则4.源码内存对齐算法 ...

  • 第一天重点图

    一、alloc 二、内存对齐 三、isa的初始化 & 指向分析

  • iOS内存对齐分析

    什么是内存对齐? 在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、floa...

  • iOS内存对齐分析

    今天探索的是内存是如何分配,如何对齐的, 一般我们在开发时通常都会用到LLDB断点调试, 看看下图对JJPerso...

  • iOS - 内存对齐分析

    iOS 内存对其原则 数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第⼀个数据成员放在...

  • 内存对齐

    内存对齐 什么叫内存对齐内存对齐就是按照特定的规则对数据进行存储,一般编译器按照8字节对齐标准处理。内存对齐一般用...

网友评论

      本文标题:内存对齐分析

      本文链接:https://www.haomeiwen.com/subject/ujndektx.html