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)内存布局,虚函数表布局,由实现决定,没有规定必须怎么样实现