现在的位置: 首页 > 综合 > 正文

虚函数、虚继承对sizeof的影响

2013年10月13日 ⁄ 综合 ⁄ 共 1943字 ⁄ 字号 评论关闭

虚函数、虚继承对sizeof的影响

1、一个空类的大小

代码如下:
#include <iostream>
using namespace std;

class A
{
};

int main()
{
	cout << "A size = " << sizeof(A) << endl;
	return 0;
}

输出结果为:

分析:空类大小为1,编译器安插一个char给空类,用来标记它的每一个对象。

2、包含数据成员的类的大小

代码如下:
#include <iostream>
using namespace std;

class A
{
public:
	int a;
	char c;
};

int main()
{
	cout << "int size = " << sizeof(int) << endl;
	cout << "char size = " << sizeof(char) << endl;
	cout << "A size = " << sizeof(A) << endl;
	return 0;
}	

输出结果如下:

分析:类(或结构)的大小需为类中最大数据类型的整数倍,CPU访问对齐数据效率最高的,因此通常编译时浪费一些空间来使得数据是对齐的。我们也可以编译指示对齐的大小。在上面的代码中我们只需要在程序开头的地方指定语句#pragma pack(1),指示编译器以1对齐。我们可以预期到A size = 5。
修改后输出结果如下:

3、包含数据成员和普通函数的类的大小

在原来代码的基础上我们为A类填一个函数AA,我们再来观察类A大小的变化。
代码如下:
#include <iostream>
using namespace std;

class A
{
public:
	int a;
	char c;
	void AA();
};

int main()
{
	cout << "int size = " << sizeof(int) << endl;
	cout << "char size = " << sizeof(char) << endl;
	cout << "A size = " << sizeof(A) << endl;
	return 0;
}

输出结果如下:

分析:普通成员函数的添加并不会对类的大小产生影响,故在类A中填加AA这个成员函数是不会影响类A的大小(填加n个普通成员函数也是一样)。

4、包含虚函数的类的大小

代码如下:
#include <iostream>
using namespace std;

class A
{
public:
	int a;
	char c;
	void AA();
	virtual void func1();
};

int main()
{
	cout << "int size = " << sizeof(int) << endl;
	cout << "char size = " << sizeof(char) << endl;
	cout << "A size = " << sizeof(A) << endl;
	return 0;
}

输出结果如下:

分析:我们可以看到当添加了一个虚函数,类的大小增加了4,这个是因为当类中友虚函数时,类会多一个虚函数表指针(virtual
table pointer),而这个指针占4个字节。

5、虚继承对类大小的影响

先看一段代码:
#include <iostream>
using namespace std;

class A
{
public:
	int a;
	char c;
	void AA();
	virtual void func1();
};

class B: public virtual A
{
public:
	int b;
};

class C
{
public:
	int c;
	char cc;
	void CC();
	virtual void func2();
};

class D : public C
{
public:
	int d;
};

class E : public virtual A, public virtual C
{
};
int main()
{
	cout << "B 虚继承A" << endl;
	cout << "A size = " << sizeof(A) << endl;
	cout << "B size = " << sizeof(B) << endl;
	cout << "D 正常继承C" << endl;
	cout << "C size = " << sizeof(C) << endl;
	cout << "D size = " << sizeof(D) << endl;
	cout << "E 虚继承A, 虚继承C" << endl;
	cout << "E size = " << sizeof(E) << endl;
	return 0;
}

输出结果如下:

分析:从输出结果我们可以看出,虚继承的类较普通继承的类大小大了4,这额外的4个字节是从那里来呢?事实上这4个字节是为子类添加虚表指针而增加的,虚继承要求子类不和父类共享虚表指针,非虚继承,子类和父类共享同一个虚表指针。
相关文章链接:

抱歉!评论已关闭.