内存对齐
内存对齐的原则
结构体成员按自身数据类型的对齐系数进行对齐:第一个结构体成员放在 offset(偏移量)为 0 的地方,后续每个成员的起始地址要从该成员大小的整数倍开始。
结构体中成员为其他结构体,则结构体成员要按自身结构体内部的最大对齐值(成员中的数据类型所占空间值最大的那个)进行对齐:比如 struct A 中包含 struct B 类型的成员,B 中有 char、int、double 元素,那么 B 应该从 sizeof(double) 的整数倍开始存储。
结构体的自身对齐值是其成员中自身对齐值最大的那个值:即:结构体的总大小必须是其内部最大成员的整数倍,不足的要补齐。
使用 pragma 宏指令修改对齐系数
对齐系数是可以改变的,通过预处理器指令 #pragma pack(n),n=1,2,4,8,16 来自定义对齐系数,通过 #pragma pack(),来取消自定义对齐系数。
宏定义 pragma pack(value) 的 value 就是指定的对齐值,通常 value 的值取 2 的较小次方。
如果 value 的值小于变量类型的对齐值,则按照 value 的值进行对齐。
如果 value 的值大于变量类型的对齐值,则按照原来的对齐值进行对齐。
简而言之,使用该宏的时候,按照 value 值和原来对齐值之间较小的值进行对齐。