1、空类
class Base {};
sizeof(Base)等于1。Base是一个空类,类在进行实例化的时候就是给一个实例分配一块内存,对一个空类进行实例化的时候,同样需要分配一块内存,编译器默认分配一个字节大小的内存给空类实例,所以空类的大小为一个字节。
2、一般非空类
class Base {
int val;
char ch;
};
sizeof(Base)等于8。Base包含了两个数据成员,类型为int和char,分别占用4个字节和1个字节,根据内存对齐的原则,Base大小为8个字节。
3、包含普通成员函数的一般非空类
class Base {
int val;
char ch;
void fun(){}
};
sizeof(Base)等于8。类的大小只与它的数据成员有关,与普通成员函数、构造函数、析构函数无关。
4、包含虚函数的类
class Base {
int val;
char ch;
virtual void fun(){}
};
sizeof(Base)等于12。Base定义了一个虚函数,编译时会生成虚函数表,该类型的实例都包含一个指向虚函数表的指针,这个指向虚函数表的指针保存在实例内存中的最前面的位置,根据内存对齐的原则,Base的大小为12个字节。
5、包含静态数据成员的类
class Base {
int val;
char ch;
static int num;
};
sizeof(Base)等于8。因为静态数据成员保存在全局静态数据区,该类型的所有实例共享同一个静态数据成员,静态数据成员只分配一次内存。因此,Base的大小为8个字节。
6、单继承的类
class Base {
int val;
char ch;
};
class Derive: public Base {
char c;
};
sizeof(Derive)等于12。Base的大小为8个字节,内存对齐值为4个字节,因此在Derive中相当于包含两个成员,类型分别为Base、char,根据内存对齐,对齐值为4,Derive的大小为12个字节。