结构体大小与字节对齐

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

猜你喜欢

转载自blog.csdn.net/isco22/article/details/89632945