(一)对齐准则
字节对齐的细节和具体的编译器有关,但一般而言,满足三个准则:
- 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
- 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。
- 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。
(二)四个基本概念
(1)数据类型自身的对齐值:
数据类型 自身对齐值
char型 1
short 2
int 4
float类型 4
double型 8
(2)结构体(类)自身对齐值:成员中自身对齐值最大的那个值。
(3)指定对齐值:#pragma pack (value)时的指定对齐值value,一般取值1,2,4…。
(4)结构体(类)的有效对齐值:自身对齐值和指定对齐值中较小的那个值。
(三)
数据结构中的变量(成员)是按照变量定义的先后顺序排放的。结构体的总大小sum,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。