iOS 内存对齐

304 阅读2分钟

内存对齐原则

  • 对于结构体(struct)、联合体(union)首个数据成员放在offset为0的位置
  • 后续数据成员以首成员大小的整数倍位置开始,如果首成员是数组、结构体等具有子成员的结构,则以子成员大小的整数倍位置开始
  • 如果是结构体中含有结构体作为成员,则结构体成员要以自身内部的最大元素大小整数倍作为基础。(structA中含有structBstructB 中最大元素为double,则structB以8的整数倍存储)
  • 结构体(struct)的总大小必定是其最大成员大小的整数倍,不足需要补齐

Struct1计算方式

成员 大小 补齐字节 总大小 所在位数
a 1 7 1 1
b 8 0 8 2
c 2 0 2 3
d 4 0 4 3
因为b起始位置需要是8的倍数,所以a需要补7位
a = ( 1 + 7 )
计算总和
    a + b + c + d
=   8 + 8 + 2 + 4 
=   22

最终大小需要是8的倍数,补齐2字节,最终大小24字节

Struct2计算方式

成员 大小 补齐字节 总大小 所在位数
a 4 0 4 1
b 1 0 1 1
c 2 1 3 1
d 8 0 8 2
a、b、c 3个成员加起来都不足以到8字节,所以可以放在同1位
    a + b + c 
=   4 + 1 + 2
=   7
因为d的起始位置需要是8的倍数,所以补齐1字节
( 1 + 7 ) + d = 16
已经是8的倍数不需要补齐,最终大小16

Struct3计算方式

成员 大小 补齐字节 总大小 所在位数
a 3 * 1 0 3 1
b 1 0 1 1
c 2 2 4 1
d 1 0 8 2
a、b、c 3个成员加起来都不足以到8字节,所以可以放在同1位
    a + b + c
=   ( 3 x 1 ) + 1 + 2
=   6
因为d的起始位置需要是8的倍数,所以补齐2字节
( 6 + 2 )+ d = 16
已经是8的倍数不需要补齐,最终大小16

打印结果