1.空类函数
class A { }; sizeof(A); //1
解析:类的实例化就是为每一个实例在内存中分配一块地址;每一个类在内存中都有惟一的标识,所以空类被实例化时,编译器会隐含地为其添加一个字节,以做区分。spa
2.虚函数类指针
class A { virtual void Fun(); }; sizeof(A); //4
解析:当一个类中包含虚函数时,会有一个指向其虚函数表的指针vptr,系统为类指针分配大小为4个字节(即便有多个虚函数)。code
3.普通数据成员blog
class A { int a; char b; }; sizeof(A); //8
解析:普通数据成员,按照其数据类型分配大小,因为字节对齐,因此a+b=8字节。继承
4.静态数据成员内存
class A { int a; static int b; }; sizeof(A); //4
解析:静态数据成员存放的是全局数据段,即便它是类的一个成员,但不影响类的大小;无论类产生多少实例或者派生多少子类,静态成员数据在类中永远只有一个实体存在。而类的非静态数据成员只有被实例化时,才存在,但类的静态数据成员一旦被声明,不管类是否被实例化,它都已存在,类的静态数据成员能够说是一种特殊的全局变量。编译器
5.普通成员函数编译
class A { void Fun(); }; sizeof(A); //1
解析:类的大小与它的构造函数、析构函数以及其余成员函数无关,只与它的数据成员相关。class
6.普通继承
class A { int a; }; class B:public A { int b; }; sizeof(B); //8
解析:普通类的继承,类的大小为自己数据成员大小+基类数据成员大小。
7.虚函数继承
virtual class A { int a; }; class B:virtual public A { int b; }; sizeof(B); //12
解析:虚函数类的继承,派生类大小=派生类自身成员大小+基类数据成员大小+虚拟指针大小(即便继承多个虚基类,也只有一个指向其虚函数表的指针vptr,大小为4字节)。