类的大小只包括那些成员变量的大小,成员函数不计算在内。
成员函数还是以一般的函数一样的存在。a.fun()是通过fun(a.this)来调用的。所谓成员函数只是在名义上是类里的。其实成员函数的大小不在类的对象里面,同一个类的多个对象共享函数代码。而我们访问类的成员函数是通过类里面的一个指针实现,而这个指针指向的是一个table,table里面记录的各个成员函数的地址(当然不同的编译可能略有不同的实现)。所以我们访问成员函数是间接获得地址的。所以这样也就增加了一定的时间开销,这也就是为什么我们提倡把一些简短的,调用频率高的函数声明为inline形式。
Example 1:
class CBase
{
};
结果:sizeof(CBase)=1。
为什么空的什么都没有的类的大小是1呢?
c++要求每个实例在内存中都有独一无二的地址。
空类也会被实例化,所以编译器会给空类隐含的添加一个字节,这样空类实例化之后就有了独一无二的地址了。所以空类的sizeof为1。
Example 2:
class CBase { int a; char p; };
结果:sizeof(CBase) = 8;
记得对齐的问题。int 占4字节,char占一字节,补齐3字节
Example 3:
class CBase
{
public:
CBase(void);
virtual ~CBase(void);
private:
int a;
char *p;
};
结果:sizeof(CBase) = 12;
C++ 类中有虚函数的时候有一个指向虚函数的指针(vptr),在32位系统分配指针大小为4字节。无论多少个虚函数,只有这一个指针,4字节。
Example 4:
class CChild : public CBase
{
public:
CChild(void);
~CChild(void);
virtual void test();
private:
int b;
};
结果:sizeof(CChild) = 16 ;
可见子类的大小是本身成员变量的大小加上父类的大小。
父类子类共享一个虚函数指针。