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