VS2013 win32
运行以下代码,得出的结果的D的size是28个字节,
将以下代码中D的两个重写函数去掉,得出的结果的D的size是20个字节
对于前者本人表示不能理解,后者更加符合本人的想象
运行以下代码,得出的结果的D的size是28个字节,
将以下代码中D的两个重写函数去掉,得出的结果的D的size是20个字节
对于前者本人表示不能理解,后者更加符合本人的想象
#include <iostream> using namespace std; class A { public: virtual ~A() { cout << "dest A" << endl; } virtual void DoA() { cout << "do A" << endl; } }; class B { public: virtual ~B() { cout << "dest B" << endl; } virtual void DoB() { cout << "do B" << endl; } }; class C { public: virtual ~C() { cout << "dest C" << endl; } virtual void DoC() { cout << "do C" << endl; } }; class D : public virtual A, public virtual B, public C { int num_ = 0xdddddddd; public: ~D() { cout << "dest D" << endl; } //void DoA() override { // cout << "D do A" << endl; //} //void DoB() override { // cout << "D do B" << endl; //} }; int main() { cout << sizeof(A) << endl << sizeof(B) << endl << sizeof(C) << endl << sizeof(D) << endl; D* p4 = new D; delete p4; return 0; }
在delete p4处断点截图
1)D有重写A和B的函数
2)D没有重写,这张图符合想象:
非虚基类C的虚函数表指针
D的虚基类表指针
D的int字段
A的虚函数表指针
B的虚函数表指针
4 + 4 + 4 + 4 + 4 = 20
请高手指点迷津,为什么第一张图会在A和B的虚函数表指针前面填充4个字节?
解决方案
30
https://msdn.microsoft.com/en-us/library/7sf3txa8(v=vs.120).aspx
研究跟实现相关的内存模型没什么意义
研究跟实现相关的内存模型没什么意义
10
1)没有 成员变量的类缺省是1个字节的
2)有虚函数表的,可能也有 运行时信息
3)VC某版本,虚函数表是个虚函数表数组
4)内存布局,虚函数表布局,由实现决定,没有规定必须怎么样实现
2)有虚函数表的,可能也有 运行时信息
3)VC某版本,虚函数表是个虚函数表数组
4)内存布局,虚函数表布局,由实现决定,没有规定必须怎么样实现