C++ 编译器内存填充:对象应该具有相同的大小吗?
C++ compiler memory padding: should objects have the same size?
在C++中,编译器会在对象数据成员之间插入padding,显然padding的长度相当于最大的数据类型。
现在据我了解,如果编译器要 'pad' 每个较小的数据类型到最大的大小,为什么对象不简单地标准化为单一数据类型? (最大的)
通常,编译器会将 align 成员的填充插入与其大小相匹配的边界。这里将在 a
和 b
之间插入 16 位填充,以确保 b
是 32 位对齐的。
int16_t a;
/* 16 bits of padding */
int32_t b;
但如果结构成员自然会填充 space,则无需插入填充。这里每个成员都已经对齐:a
和 b
是 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;
在C++中,编译器会在对象数据成员之间插入padding,显然padding的长度相当于最大的数据类型。
现在据我了解,如果编译器要 'pad' 每个较小的数据类型到最大的大小,为什么对象不简单地标准化为单一数据类型? (最大的)
通常,编译器会将 align 成员的填充插入与其大小相匹配的边界。这里将在 a
和 b
之间插入 16 位填充,以确保 b
是 32 位对齐的。
int16_t a;
/* 16 bits of padding */
int32_t b;
但如果结构成员自然会填充 space,则无需插入填充。这里每个成员都已经对齐:a
和 b
是 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;