};
#pragma pack()
例子 1 和例子 2 不同之处在于例子 2 中使用了#pragma pack(2)编译参数,它强制指定对齐模
数是 2。此例子 Windows 和 Linux 计算方法有些许不一致。
在 Windows 中计算步骤如下:
步骤 1:所有数据成员自身长度和:1B + 8B = 13B --> sum_a = 9B
步骤 2:数据成员 a 放在相对偏移 0 处,之前不需要填充字节;数据成员 b 为了内存对齐,
根据“结构体大小的计算方法和步骤”中第二条原则,其对齐模数是 2,之前需填充 1 个字节,
sum_a + 1 = 10B --> sum_b = 10 B
步骤 3:按照定义,结构体对齐模数是结构体内部最大数据成员长度和 pragma pack 中较小
者,前者为 8 后者为 2,所以结构体对齐模数是 2。sum_b 是 2 的 5 倍,不需再次对齐。
综上 3 步,可知结构体的长度是 10B,各数据成员在内存中的分布如图 2-1 所示。
在 Linux 中计算步骤如下:
步骤 1:所有数据成员自身长度和:1B + 12B = 13B --> sum_a = 13B
步骤 2:数据成员 a 放在相对偏移 0 处,之前不需要填充字节;数据成员 b 为了内存对齐,
根据“结构体大小的计算方法和步骤”中第二条原则,其对齐模数是 2,之前需填充 1 个字节,
sum_a + 1 = 14B --> sum_b = 14 B
步骤 3:按照定义,结构体对齐模数是结构体内部最大数据成员长度和 pragma pack 中较小
者,前者为 8 后者为 2,所以结构体对齐模数是 2。sum_b 是 2 的 7 倍,不需再次对齐。
综上 3 步,可知结构体的长度是 14B,各数据成员在内存中的分布如图 2-2 所示。
例子 3:
struct my_struct
{
char a;
double b;
char c;
};
前两例中,数据成员在 Linux 和 Windows 下都相同,例 3 中 double 的对齐模数在 Linux 中是