1. 对齐规则1 数据成员对齐规则:
结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照 #pragma pack
指定的数值和这个数据成员自身长度中,比较小的那个进行。
a=数据成员自动长度 b=#pragma pack
指定的数值n,n的取值范围为1,2,4,8,16
该数据成员对齐字节=min(a,b)
2. 对齐规则2 结构(或联合)的整体对齐规则:
在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack
指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
a=结构(或联合)最大数据成员长度
b=#pragma pack
指定的数值n,n的取值范围为1,2,4,8,16
该数据成员对齐字节=min(a.b)
3. 对齐规则3
当#pragma pack
的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。
a=max(所有数据成员长度)
If(n>a){n无效}
4. 对齐规则4
第一个数据成员偏移量为0。其他各成员变量存放的起始地址相对于结构的起始地址的偏移量必须为该变量的类型所占用的字节数的倍数,倍数为1。
a=0 ,a代表第一个数据成员偏移量
b=成员变量占用字节数
n=偏移量
n%b=0
5. 对齐规则5
各成员变量在存放的时候根据在结构中出现的顺序依次申请空间,同时按照上面的对齐方式调整位置,空缺的字节自动填充。
6. 对齐规则6
同时为了确保结构的大小为结构的字节边界数(即该结构中占用最大空间的类型所占用的字节数)的倍数,所以在为最后一个成员变量申请空间后,还会根据需要自动填充空缺的字节。
a=结构中占用最大空间的类型所占用的字节数
b=结构中除最后一个成员变量,其他成员所占字节之和
结构体大小=大于b且是a的倍数的最小数。
7. 对齐规则7
通过预编译命令改变对齐系数为1的时候,结构的大小等于结构体各个成员变量占用字节之和。各成员变量依次存放,不产生填充字节。