子类重写虚基类的虚函数导致多占4个字节

C++语言 码拜 5年前 (2016-06-06) 476次浏览
VS2013 win32
运行以下代码,得出的结果的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的函数
子类重写虚基类的虚函数导致多占4个字节
2)D没有重写,这张图符合想象:
非虚基类C的虚函数表指针
D的虚基类表指针
D的int字段
A的虚函数表指针
B的虚函数表指针
4 + 4 + 4 + 4 + 4 = 20
子类重写虚基类的虚函数导致多占4个字节
请高手指点迷津,为什么第一张图会在A和B的虚函数表指针前面填充4个字节?

解决方案

30

https://msdn.microsoft.com/en-us/library/7sf3txa8(v=vs.120).aspx
研究跟实现相关的内存模型没什么意义

10

1)没有 成员变量的类缺省是1个字节的
2)有虚函数表的,可能也有 运行时信息
3)VC某版本,虚函数表是个虚函数表数组
4)内存布局,虚函数表布局,由实现决定,没有规定必须怎么样实现

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明子类重写虚基类的虚函数导致多占4个字节
喜欢 (0)
[1034331897@qq.com]
分享 (0)