iOS|iOS 底层原理探索之内存对齐探究-结构体嵌套结构体

前言
我们都知道内存都是以字节为单位存储的,但是处理器大部分不是按照字节块来存取内存的,它一般会以2字节,4字节,8字节,16字节甚至32字节为单位来存取内存,我们将上述这些存取单位称为内存存取粒度.
我们先来简单看下结构体中不同元素类型所占空间大小,方便我们后面的探究

iOS|iOS 底层原理探索之内存对齐探究-结构体嵌套结构体
文章图片
image.png
对象的内存对齐 --> 来自于结构体
结构体对其原则是:首先找到最大的成员变量,结构体总大小是最大成员变量大小的倍数。
普通结构体
例1

typedef struct{ char a; //1字节 int b; //4字节 char c; //1字节 } MKStruct; sizeof(MKStruct) = 12

根据上面结构体代码我们可以分析得出下面的内存存储结构

iOS|iOS 底层原理探索之内存对齐探究-结构体嵌套结构体
文章图片
image.png 解析:
1.第一个成员变量放在offset为0的地方,按照字节大小 a为1字节大小 [0]。
2.接下来的成员变量起始位置应该是该成员大小的倍数,b为int类型4字节,所以起始位置应该是从4开始 [4,7].
3.c为1字节,8为1的倍数,所以c的位置[8]
4.根据结构体对齐原则:结构体总大小是最大成员变量大小的倍数。所以该结构体中最大成员变量为4,总大小为4的倍数,顾:根据对齐原则:该结构体大小为12。
通过上面的例子我们了解了什么是结构体对齐
下面我们再看几个列子增进理解:
例2
typedef struct { char a; //1字节 int b; //4字节 char c; //1字节 double d; //8字节 } MKStruct; sizeof(MKStruct) = 24

iOS|iOS 底层原理探索之内存对齐探究-结构体嵌套结构体
文章图片
image.png 解析:
a长度为1字节,a=>[0]
b长度为4字节,起始位置应为4的倍数,所以offset+3=4,b=>[4,7]
c长度为1字节,8是1的倍数,因此c=>[8]
d长度为8字节,起始位置应为8的倍数,offset=9不行,所以offset+7 = 16为8的倍数,因此d=>[16,23]
根据对齐原则:结构体总大小是最大成员变量大小的倍数。所以该结构体中最大成员变量为8,总大小为8的倍数,顾:根据对齐原则:该结构体大小为24
例3
typedef struct { char a; //1字节 char c; //1字节 int b; //4字节 double d; //8字节 } MKStruct; sizeof(MKStruct) = 16

iOS|iOS 底层原理探索之内存对齐探究-结构体嵌套结构体
文章图片
image.png 解析:
a长度为1字节,a=>[0]
b长度为1字节,起始位置应为1的倍数,b=>[1]
c长度为4字节,起始位置应为4的倍数,因此c=>[4,7]
d长度为8字节,起始位置应为8的倍数,offset=8是8的倍数,因此d=>[8,15]
根据对齐原则:结构体总大小是最大成员变量大小的倍数。所以该结构体中最大成员变量为8,总大小为8的倍数,顾:根据对齐原则:该结构体大小为16
注:根据上面两个例子我们发现,同样的属性情况,但是开辟的内存不一样,尽管我们在内存中采用了内存对齐的方式,但并不是所有的内存都可以进行浪费的,苹果会自动对属性进行重排,以此来优化内存。
结构体嵌套结构体
struct struct { char a; //1字节 char b; //1字节 int c; //4字节 } MKStruct1; struct struct { char a; //1字节 MKStruct1 A; char b; //1字节 } MKStruct2; sizeof(MKStruct1) = 8; sizeof(MKStruct2) = 16;

iOS|iOS 底层原理探索之内存对齐探究-结构体嵌套结构体
文章图片
image.png
iOS|iOS 底层原理探索之内存对齐探究-结构体嵌套结构体
文章图片
image.png 解析:
MKStruct2中
【iOS|iOS 底层原理探索之内存对齐探究-结构体嵌套结构体】a长度为1字节,a=>[0]
A长度为8字节,其中根据对齐原则,MKStruct1中最大成员变量为4字节,应为4的倍数,所以起始位置A=>[4,11]
b长度为1字节,因此b=>[12]
根据对齐原则:结构体总大小是最大成员变量大小的倍数。所以该结构体中最大成员变量为4,总大小为4的倍数,顾:根据对齐原则:该结构体大小为16
结构体对齐总结
结构体总大小是最大成员变量大小的倍数。
结构体嵌套结构体对齐总结
结构体作为结构体成员,其对齐值取其自身成员中最长数据类型的成员的长度的倍数。
总结 内存对齐就是为了更高效合理的利用内存空间而定制的一套规则,简单来说就是一空间换时间的过程。
以上是自己对内存对齐的一些理解,如发现有误欢迎各位大神指点。
未完待续···不断学习,不断更新

    推荐阅读