注意
- 不同编译器有各自默认对齐数,此处以默认对齐数为8个字节为例。
- 结构体中每个成员有各自的成员对齐数即min(类型大小,默认对齐数)。
- 参与对齐的成员只能是基础类型,若该成员是结构体嵌套则相当于把结构体展开讨论,若该成员是数组则该处对齐成员为数组的基本类型。
- 可以使用
#pragma pack()
来改变编译器默认对齐数,且括号内只能填写2^n的数如1、2、4。
对齐规则
- 结构体首个成员于结构体内存偏移量为0的位置开始存放,后续成员开始存放位置偏移量为整数倍的成员对齐数。
- 结构体的大小为该结构体内最大成员对齐数的整数倍。
快速计算结构体大小
- 连续的几个成员的对齐数之和若小于旁边一个成员的对齐数则在计算时这几个成员大小之和增加为旁边一个成员的对齐数。
- 结构体大小=结构内所有成员大小之和+变化后对齐数增量。
代码
例1
根据公式:结构体大小=结构内所有成员大小之和+对齐数增加数。这里7个成员变量的大小为61,此处只有变量l+k<g,5变成8增量为3。
即:结构体大小=61+3=64。
例2
根据公式:结构体大小=结构内所有成员大小之和+对齐数增加数。这里包括嵌套内的成员变量的大小为67,此处增量为3。
即:结构体大小=67+3=70。
- 例1因为默认对齐数大于等于结构内最大类型大小(这里是double类型8B),因此算的时候可以直接算。