C++ 编译器内存填充:对象应该具有相同的大小吗?

C++ compiler memory padding: should objects have the same size?

在C++中,编译器会在对象数据成员之间插入padding,显然padding的长度相当于最大的数据类型。

现在据我了解,如果编译器要 'pad' 每个较小的数据类型到最大的大小,为什么对象不简单地标准化为单一数据类型? (最大的)

通常,编译器会将 align 成员的填充插入与其大小相匹配的边界。这里将在 ab 之间插入 16 位填充,以确保 b 是 32 位对齐的。

int16_t a;
/* 16 bits of padding */
int32_t b;

但如果结构成员自然会填充 space,则无需插入填充。这里每个成员都已经对齐:ab 是 16 位对齐的,c 是 32 位对齐的。

int16_t a;
int16_t b;
int32_t c;

将每个变量标准化为 32 位会浪费 space。

同样,您可以混合使用各种大小。插入少量填充比将所有变量扩展到较大的统一大小更有效。

int8_t a;
/* 8 bits of padding */
int16_t b;
int32_t c;