在C ++中,编译器在对象数据成员之间插入填充,显然,填充的长度等同于最大的数据类型。
现在据我所知,如果编译器要去填充'每个较小的数据类型到最大的大小,为什么没有对象简单地标准化为单个数据类型? (最大的一个)
答案 0 :(得分:1)
通常,编译器会将align成员的填充插入到与其大小匹配的边界。这里将在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;