1.明确一个宏定义
#pragma pack(n) n=1, 2, 4, 8, 16, 32, ....
该宏是用来设置对齐模数,当不写入n,#pragma pack()这种情况是设置为默认字节模数
注:32位系统默认字节模数是4,64位系统默认字节模数是8
2.成员字节偏移
在结构体每个成员变量字节偏移的计算中,取对齐模数和变量本身大小中小的那个
例:
①将字节模数设置为4
注:因为对齐模数[4] < 本身字节数[8],所以取4
前两个变量大小为:1+(3)+8
②将字节模数设置为16
注:因为对齐模数[16] > 本身字节数[8],所以取8
前两个变量大小为:1+(7)+8
3.结构体偏移
计算最终结构体大小偏移时,取对齐模数和结构体中最大成员变量大小中小的那个,最终结构体大小应该是那个小的数的倍数
例如:
①对齐模数设置为4
注:因为对齐模数[4] < 最大成员大小(double)[8],所以取4
理论大小=1+(3)+8+2=14,不是4的倍数,所以实际大小=1+(3)+8+2+(2)=16
②对齐模数设置为16
注:因为对齐模数[16] < 最大成员大小(double)[8],所以取8
理论大小=1+(7)+8+2=18,不是8的倍数,所以实际大小=1+(7)+8+2+(6)=24