为什么OC对象在开辟内存的时候会有内存对齐原则,在对象申请内存的时候是16字节对齐的,在真正开辟所需要的内存时时8字节对齐的,为什么会有这些对齐呢,主要是为了容错,那具体怎么看对象是怎么对齐的呢,我们可以通过研究struct结构体的内存对齐原则来稍微了解下(ps:对象的内存对齐是对结构体内存对齐的优化)
1.数据成员对⻬规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存储的起始位置要
从该成员大小或者成员的子成员大小(只要该成员有子成员,比如说是数组,
结构体等)的整数倍开始(比如int为4字节,则要从4的整数倍地址开始存
储。
文字看起来很麻烦,直接上代码
struct MCStruct1 {
char a; //1 [0]
short b; //2 1 [2 3]
double c;//8 4 5 6 7 [8 9 10 11 12 13 14 15]
char d; //16 [16]
}mcstaruct1; //一共占用17个字节,但是要是里面最大的属性字节大小的倍数,所以是8的倍数,为24个字节
开始运行,结果如图,跟我们预计是是一样的
pic0
那如果结构体内嵌结构体呢,那就会遵循第二个结构体内存对齐原则
2.结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从
其内部最大元素大小的整数倍地址开始存储.(struct a里存有struct b,b
里有char,int ,double等元素,那b应该从8的整数倍开始存储.)
直接上代码
struct MCStruct1 {
char a; //1 [0]
short b; //2 1 [2 3]
double c;//8 4 5 6 7 [8 9 10 11 12 13 14 15]
char d; //16 [16]
}mcstaruct1; //一共占用17个字节,但是要是里面最大的属性字节大小的倍数,所以是8的倍数,为24个字节
struct MCStruct2 {
char a; //1 [0]
short b; //2 1 [2 3]
double c;//8 4 5 6 7 [8 9 10 11 12 13 14 15]
struct MCStruct1 d;//24 字节
}mcstaruct2;//16 + 24 = 40字节 刚好是里面结构内结构体最大属性字节数8的倍数,所以大小为40字节
开始运行,结果如下
pic1
OC对象的内存对齐是类似于结构体的内存对齐的,只是更优于结构体的内存对齐。
网友评论