iOS 底层探索03-内存对齐

在iOS 底层探索02-alloc/init/new 探索提到了alloc 流程中涉及的一个重要方法:instanceSize.

追踪发现最终实现的是16字节对齐,今天来探索下内存对齐.

为什么要内存对齐

我们先来看来定义两个结构体,

iOS 底层探索03-内存对齐_第1张图片

通过 sizeof方法打印得到他们的大小

两个结构体里的属性都一样,可结构体的大小不一样,体现了结构体的内存对齐规则。 

在结构体中,从结构体的首地址开始,假设地址从0开始。 

对结构体testStruct1来说,double a占8个字节,占从0~7的字节,char b是char类型占1个字节,占第8个的字节,int c占4个字节,占12~15位 (b 结束是第9位) ,short d占两个字节,占16~17;

so 对结构体testStruct1:内部需要的大小为:17,最大属性:8,那么结构体字节为最大属性整数倍,就是24字节;

对结构体testStruct2来说,double a占8个字节,占从0~7的字节,int b占4个字节,占8~11位,char c是char类型占1个字节,占第12个的字节,,short d占两个字节,占14~15字节.

so 对结构体testStruct2:内部需要的大小为:15,最大属性:8,那么结构体字节为最大属性整数倍,就是16字节;

内存对齐规则是按照成员的声明顺序,依次安排内存,其偏移量为成员大小的整数倍,0看做任何成员的整数倍,最后结构体的大小为最大成员的整数倍。

这里附上各数据类型大小表

iOS 底层探索03-内存对齐_第2张图片

内存对齐的原则

1:数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第⼀个数据成员放在offset为0的地⽅,以后每个数据成员存储的起始位置要从该成员⼤⼩或者成员的⼦成员⼤⼩(只要该成员有⼦成员,⽐如说是数组,结构体等)的整数倍开始(⽐如int为4字节,则要从4的整数倍地址开始存储。 min(当前开始的位置m n) m = 9 n = 4  9 10 11 12 

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

3:收尾⼯作:结构体的总⼤⼩,也就是sizeof的结果,.必须是其内部最⼤成员的整数倍.不⾜的要补⻬。

你可能感兴趣的:(iOS 底层探索03-内存对齐)