【发布时间】:2019-12-20 05:12:58
【问题描述】:
在这里,在这段代码中,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
【问题讨论】:
-
virtual机制需要一些开销。一些编译器将这些开销放入结构中。 -
您应该养成始终通过
'\n'或std::endl终止输出的习惯。 -
通常有一个vtable指针引入了虚拟继承。这或许可以解释大小的差异,
-
@πάνταῥεῖ:“通常有一个 vtable 指针”。虚拟继承是否引入了 vtable 指针?我不信!
-
我希望 ob2 的大小为 20,但输出为 24 你的确切平台是什么?对象内部的某些东西可能有 8 字节对齐要求。或者平台本身通常会强制要求 8 字节对齐。
标签: c++ virtual-inheritance memory-layout vptr