在C++中,编译器在对象数据成员之间插入填充,显然,填充的长度相当于最大的数据类型。
现在,据我所知,如果编译器要将每个较小的数据类型"填充"为最大的数据类型,那么为什么不将对象简单地标准化为单个数据类型呢?(最大的一个)
通常,编译器会插入填充以将成员与与其大小匹配的边界对齐。这里将在a
和b
之间插入16位填充以确保b
是32位对齐的。
int16_t a;
/* 16 bits of padding */
int32_t b;
但是,如果结构成员会自然地填充该空间,则不需要插入填充。这里每个成员已经对齐:a
和b
是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;