四个重要的基本概念:
1) 数据类型自身的对齐值:char型数据自身对齐值为1字节,short型数据为2字节,int/float型为4字节,double型为8字节。
2) 结构体或类的自身对齐值:其成员中自身对齐值最大的那个值。
3) 指定对齐值:#pragma pack (value)时的指定对齐值value。
4) 数据成员、结构体和类的有效对齐值:自身对齐值和指定对齐值中较小者,即有效对齐值=min{自身对齐值,当前指定的pack值}。
结构体字节对齐的细节和具体编译器实现相关,但一般而言满足三个准则:
1) 第一个成员在结构体变量中的偏移量为0的地址处,也就是第一个成员必须从头开始。
2) 结构体每个成员要对齐到对齐数的整数倍,对齐数为编译器默认对齐数与该成员大小中的较小值。默认对齐数可以通过#pragma pack()修改。但只能改成1,2,4,8,16
3) 结构体的总大小为结构体最宽成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节{trailing padding}。
原文:https://www.cnblogs.com/nanqiang/p/10546659.html