【发布时间】:2014-07-29 09:46:18
【问题描述】:
让我们考虑结构:
struct S1 {
int a;
char b;
};
struct S2 {
struct S1 s; /* struct needed to make this compile as C without typedef */
char c;
};
// For the C++ fans
struct S3 : S1 {
char c;
};
S1 的大小为 8,由于对齐,这是预期的。但是 S2 和 S3 的大小是 12。这意味着编译器将它们构造为:
| 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10| 11|
| a | b | padding | c | padding |
编译器可以在不破坏对齐约束的情况下将 c 放在 6 7 8 的填充中。阻止它的规则是什么,背后的原因是什么?
【问题讨论】:
-
这当然并不意味着编译器一定是这样布局的。
-
在制作这些结构的数组时,仍然需要正确对齐。最后需要额外的填充。
-
@HansPassant:这并不能解释为什么
S3不能放入 8 个字节中...... -
因此您希望编译器根据
S1是S2的一部分还是单独出现来以不同方式处理它? -
这是一个语言设计者需要考虑的有趣问题。当我们为 IBM iSeries 实现 Java 时,我们发现如果我们“打包”结构(同时仍保持硬件首选的对齐方式),我们节省了足够的存储空间,从而提高了大约 10% 的性能,这是由于缓存使用的改进和减少的垃圾收集负载。 (当然,Java 标准对对象中变量的顺序或布局没有任何限制,因此我们可以摆脱这一点,因为 C++ 实现者就没有那么幸运了。)
标签: c++ c struct memory-alignment