内存对齐的规则:
1、 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身长度) 的倍数。
2、 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
通过下面一个例子学习内存对齐:
int 4B short 2B char 1B ,一共6种组合:
1. char int short ==》
第一步:进行数据成员对齐:
char占一个字节,起始偏移为0 ,int 占4个字节,这个数据成员的自身长度= 4,所以int按4字节对齐,起始偏移必须为4的倍数,所以起始偏移为4,在char后编译器会添加3个字节的额外字节,不存放任意数据。short占2个字节,按2字节对齐,起始偏移为8,正好是2的倍数,无须添加额外字节。到此规则A的数据成员对齐结束,此时的内存状态为:
o x x x | o o o o | o o (x表示额外添加的字节)
0 1 2 3 4 5 6 7 8 9 (地址)
第二步:进行结构本身的对齐:
对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行,该结构中最大数据成员长度为int,占4字节,而默认的#pragma pack 指定的值为8,所以结果本身按照4字节对齐,结构总大小必须为4的倍数,需添加2个额外字节使结构的总大小为12 。此时的内存状态为:
o x x x | o o o o | o o x x