提问人:Kirill Afentev 提问时间:10/10/2023 最后编辑:Kirill Afentev 更新时间:10/10/2023 访问量:86
多级继承和空基优化中的内存布局
Memory layout in multilevel inheritance and empty base optimization
问:
请考虑以下继承:
struct Empty {};
struct A: Empty {
int64_t a;
int8_t b;
};
struct B: A {
int32_t c;
};
在 GCC 和 Clang 上为 16,但在 MSVC 上为 24。如果从以下位置删除继承:B
A
Empty
struct A {
int64_t a;
int8_t b;
};
struct B: A {
int32_t c;
};
在所有 3 个编译器上,sizeof 突然变为 24。我猜这与空基优化有关,但我无法弄清楚这些类在不同情况和编译器中在内存中的实际布局(以及这样做的原因)。此外,我希望参考该标准,其中说明了多级继承中的 EBO。B
我试图在不同的继承场景中查看 GCC 和 Clang。在第一种情况下,它等于第二种情况下的 12 和 16,但我不明白为什么。offsetof(B, c)
答: 暂无答案
评论
B
不是标准布局。因此,该标准基本上没有指定任何关于其布局的内容(除了某些子对象地址的顺序)。布局规则由适用的 ABI 规范确定,例如 GCC/Clang + Linux 上的 C++ Itanium ABI。MSVC 使用自己的 ABI。A
是标准布局,但每个标准的唯一含义是,第一个示例和第二个示例中的偏移量为零(相对于 的地址)。Empty
a
A
A
Empty
struct A { ~A() {} .... };
We ignore tail padding for PODs because an early version of the standard did not allow us to use it for anything else and because it sometimes permits faster copying of the type.