虚函数、虚继承对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个字节是为子类添加虚表指针而增加的,虚继承要求子类不和父类共享虚表指针,非虚继承,子类和父类共享同一个虚表指针。
相关文章链接: