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

时间:2015-11-17 16:54:19

标签: c++ padding

在C ++中,编译器在对象数据成员之间插入填充,显然,填充的长度等同于最大的数据类型。

现在据我所知,如果编译器要去填充'每个较小的数据类型到最大的大小,为什么没有对象简单地标准化为单个数据类型? (最大的一个)

1 个答案:

答案 0 :(得分:1)

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

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

但是如果结构成员自然地填充该空间,则不需要插入填充。此处每个成员已经对齐:ab是16位对齐的,c是32位对齐的。

int16_t a;
int16_t b;
int32_t c;

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

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

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