虚拟类继承对象大小问题

时间:2019-08-13 15:44:37

标签: c++ virtual-inheritance memory-layout vptr

在此代码中,ob1的大小为16,这很好(由于虚拟指针),但我不明白为什么ob2的大小为24。

#include <iostream>
using namespace std;
class A {
    int x;
};
class B {
    int y, z;
};
class C : virtual public A {
    int a;
};
class D : virtual public B {
    int b;
};
int main() {
    C ob1;
    D ob2;
    cout << sizeof(ob1) << sizeof(ob2) << "\n";
}

我希望ob2的大小为20,但输出为24

2 个答案:

答案 0 :(得分:8)

D类型的对象的一种可能的布局是:

+----------+
| y        |   The B subobject (8 bytes)
| z        |
+----------+
| vptr     |   vtable pointer (8 bytes)
|          |
+----------+
| b        |   4 bytes
+----------+
| unused   |   4 bytes (padding for alignment purposes)
+----------+

那将使sizeof(ob2)为24。

对齐要求由实现定义。在大多数情况下,最大成员对象或子对象的大小决定了对象的对齐要求。在您的情况下,最大对象vtable指针的大小为8个字节。因此,该实现将对象对准8位边界,并在必要时添加填充。

答案 1 :(得分:2)

要实现虚拟继承,D包含一个指针作为数据成员,该指针在64位系统上需要8个字节。此外,这8个字节必须与8个字节的存储器边界对齐。后者的要求又要求D本身必须与8字节的内存边界对齐。最简单的实现方法是将sizeof(D)用8的倍数填充未使用的字节(21-24)。