我就从简单的类到复杂的类逐次分析类的大小:
情形1:
class A{
};
所谓的空类,我想大家应该觉得他的大小会是0吧, 这你真想错了, 即使是空类,他的大小都不会为0的。他会有一个默认的char, 为此类的对象分配一个独一无二的地址。
情形2:
class A
{
int a;
void f();
};
class B{
int b;
};
类A和类B的大小事一样的, 非虚函数存储在代码区中, 而没有虚函数的虚函数数表指针需要存储, 所以其大小都是4字节;
情形3:
class A{
int a;
char b;
};
class B{
int b;
static char c;
};
sizeof(A) = 8;
sizeof(B) = 4;
因为静态数据存储在了全局区;并不在类中;
情形4:
class A{
int a;
char b;
};
class B{
int b;
static char c;
};
class C: public A, public B
{
int d;
};
sizeof(A) = 8;
sizeof(B) = 4;
sizeof(C) = 16;因为类C继承了A和B , A在C中的大小是不变的;
情形5:
class A
{
int a;
virtual void f();
:
class B : public virtual A
{
};
class C: public virtual A
{
virtual void g();
};
class D:public virtual A
{
virtual void f();
virtual void h();
};
sizeof(A) = 8;
sizeof(B) = 12;
sizeof(C) = 16;
sizeof(D) = 12;
这是因为类A的大小为8, B虚继承A,B 中多了一个指向虚基类A的指针;
而C的大小是16, D的大小为12. 这是因为D中的函数f和A中的f导致了基类和派生类只需公用一个虚函数表即可。