您的位置:首页 > 编程语言 > C语言/C++

【深入探索c++对象模型】类对象所需内存大小讨论

2014-03-06 12:15 429 查看
class OO	//Object-Oriented
{
public:	
	OO():a(1),b(2),c(3){}	
	virtual int fun_oo(){};
	virtual int fun_oo_cpy(){};
	int a;
	int b;
	int c;
	static int temp;
};

int main()
{	
	int size = 0;
	OO test;
	size = sizeof(test);
	cout << "OO的大小为:" << size << endl;
}

g++编译后显示大小为16,有两点需要说明:

1、static的数据并保存在类对象里面;

2、由于里面有虚函数,所以需要一个vptr,只想class里面的virtual table

接着讨论在继承情况下的大小,修改代码为:

#include<iostream>
using namespace std;
class O
{
public:
	int z;
	virutal int fun_O(){};
}
class OO:public O	//Object-Oriented
{
public:	
	OO():a(1),b(2),c(3){}	
	virtual int fun_oo(){};
	virtual int fun_oo_cpy(){};
	int a;
	int b;
	int c;
	static int temp;
};

int main()
{	
	int size = 0;
	OO test;
	size = sizeof(test);
	cout << "OO的大小为:" << size << endl;
}


g++编译后显示大小为20,这说明在这种继承体系下,对于对象test只有一个vptr被维护;

接下来讨论虚拟继承下的对象大小,修改代码为:

#include<iostream>
using namespace std;
class O
{
public:
	int z;
	virutal int fun_O(){};
}
class OO:public virtual O	//Object-Oriented
{
public:	
	OO():a(1),b(2),c(3){}	
	virtual int fun_oo(){};
	virtual int fun_oo_cpy(){};
	int a;
	int b;
	int c;
	static int temp;
};

int main()
{	
	int size = 0;
	OO test;
	size = sizeof(test);
	cout << "OO的大小为:" << size << endl;
}

g++编译后显示大小为24,这说明在这种继承体系下,对于对象test不仅有有一个vptr被维护,只想OO的virtual table;还有一个vptr指向virtual base class的virual table。

《深度探究c++对象模型》中有一句话“每一个base class constructor设定其对象的vptr,使它指向相关的virtual table 之后,构造中的对象可以严格而正确的编程构造过程中所幻化出来的每一个class的对象”,可以很好的解释这个现象。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: