現對某些特殊情況的類的大小做總結:
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.與類中的構造函數,析構函數以及其他的成員函數無關