现对某些特殊情况的类的大小做总结:
1.空类
2.带有虚函数的类
3.继承父类的子类
4.带有static成员的类
5.普通类

class A 
{
}
;
//结果:sizeof(A)=1
//原因:空类并不是什么都没有,而是隐含插入了一个字节作为地址偏移量。如果空类长度为0,那创建n个类实例时会出现这些实例都在同一位置的问题。

class A 
{
    
int num;
    
virtual void func() = 0;
}
;
//结果:sizeof(A)=8
//原因:如果类中有纯虚函数或者虚函数,那么有一个指向虚函数的指针,该指针大小为4个字节。

class A 
{
}
;
class B : public A
{
    
//添加
}
;
//结果:“添加”处没有任何语句,sizeof(B)=1;添加int a,sizeof(B)=4。
//原因:和非继承的情况一样。

class A 
{
}
;
class B
{
}
;
class C : public B, public A
{
    
//添加
}
;
//结果:“添加”处中不加任何语句,sizeof(C)=1;添加int a,sizeof(C)=18;添加char a,sizeof(C)=12;添加short,sizeof(C)=14。
//原因:不添加任何语句的那1个字节是偏移量,而添加其他变量后因为对齐的原因(和结构体相同),所以出现这种结果。

class A 
{
    
int b;
    
static int a;
}
;
//结果:sizeof(A)=4
//原因:类的静态数据成员放在全局静态存储区中,不影响类的大小。而类的非静态数据成员只有被实例化的时候,他们才存在。

class A 
{
    A()
{};
    
~A(){};
    
int Func(){};
    
int a;
}
;
//结果:sizeof(A)=4
//原因:类的大小与它当中的构造函数,析构函数,以及其他的成员函数无关(纯虚函数除外),只与它当中的成员数据有关。

从以上的几个例子不难发现类的大小:
1.为类的非静态成员数据的类型大小之和
2.有编译器额外加入的成员变量的大小,用来支持语言的某些特性(如:指向虚函数的指针)
3.为了优化存取效率,进行的边缘调整
4.与类中的构造函数,析构函数以及其他的成员函数无关