一、内存对齐原则
1.引子
这三个函数打印出来的大小为啥不一样?这是因为内存对齐影响的
sizeof:计算类型所占的内存大小
class_getInstanceSize:计算对象实际占用的内存大小,规则按照8字节对齐
malloc_size:计算对象实际开辟的内存大小,规则按照16字节对齐
2.结构体对齐规则
先来个表
对齐规则:
①数据成员的对齐规则可以理解为min(m, n) 的公式, 其中 m表示当前成员的开始位置, n表示当前成员所需要的位数。如果满足条件 m 整除 n (即 m % n == 0), n 从 m 位置开始存储, 反之继续检查 m+1 能否整除 n, 直到可以整除, 从而就确定了当前成员的开始位置。
②数据成员为结构体:当结构体嵌套了结构体时,作为数据成员的结构体的自身长度作为外部结构体的最大成员的内存大小,比如结构体a嵌套结构体b,b中有char、int、double等,则b的自身长度为8
③最后结构体的内存大小必须是结构体中最大成员内存大小的整数倍,不足的需要补齐。
根据对齐规则可以验证
二、总结
1.成员变量是以8字节内存对齐的
2.分配内存的时候是以16字节内存对齐的
3.内存对齐是为了读取方便,以空间换时间。以16字节对齐是减少了读取错误的概率,方便以后的扩展