Sri*_*ose 3 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";
}
Run Code Online (Sandbox Code Playgroud)
我预计ob2的大小为20,但输出为24
类型对象的一种可能的布局D是:
+----------+
| y | The B subobject (8 bytes)
| z |
+----------+
| vptr | vtable pointer (8 bytes)
| |
+----------+
| b | 4 bytes
+----------+
| unused | 4 bytes (padding for alignment purposes)
+----------+
Run Code Online (Sandbox Code Playgroud)
那将是sizeof(ob2)24。
对齐要求由实现定义。在大多数情况下,最大成员对象或子对象的大小决定了对象的对齐要求。在您的情况下,最大对象vtable指针的大小为8个字节。因此,该实现将对象对准8位边界,并在必要时添加填充。