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



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

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

通常,编译器会插入填充以将成员与与其大小匹配的边界对齐。这里将在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;

最新更新