現(xiàn)對某些特殊情況的類的大小做總結(jié):
1.空類
2.帶有虛函數(shù)的類
3.繼承父類的子類
4.帶有static成員的類
5.普通類

class A 
{
}
;
//結(jié)果:sizeof(A)=1
//原因:空類并不是什么都沒有,而是隱含插入了一個字節(jié)作為地址偏移量。如果空類長度為0,那創(chuàng)建n個類實例時會出現(xiàn)這些實例都在同一位置的問題。

class A 
{
    
int num;
    
virtual void func() = 0;
}
;
//結(jié)果:sizeof(A)=8
//原因:如果類中有純虛函數(shù)或者虛函數(shù),那么有一個指向虛函數(shù)的指針,該指針大小為4個字節(jié)。

class A 
{
}
;
class B : public A
{
    
//添加
}
;
//結(jié)果:“添加”處沒有任何語句,sizeof(B)=1;添加int a,sizeof(B)=4。
//原因:和非繼承的情況一樣。

class A 
{
}
;
class B
{
}
;
class C : public B, public A
{
    
//添加
}
;
//結(jié)果:“添加”處中不加任何語句,sizeof(C)=1;添加int a,sizeof(C)=18;添加char a,sizeof(C)=12;添加short,sizeof(C)=14。
//原因:不添加任何語句的那1個字節(jié)是偏移量,而添加其他變量后因為對齊的原因(和結(jié)構(gòu)體相同),所以出現(xiàn)這種結(jié)果。

class A 
{
    
int b;
    
static int a;
}
;
//結(jié)果:sizeof(A)=4
//原因:類的靜態(tài)數(shù)據(jù)成員放在全局靜態(tài)存儲區(qū)中,不影響類的大小。而類的非靜態(tài)數(shù)據(jù)成員只有被實例化的時候,他們才存在。

class A 
{
    A()
{};
    
~A(){};
    
int Func(){};
    
int a;
}
;
//結(jié)果:sizeof(A)=4
//原因:類的大小與它當(dāng)中的構(gòu)造函數(shù),析構(gòu)函數(shù),以及其他的成員函數(shù)無關(guān)(純虛函數(shù)除外),只與它當(dāng)中的成員數(shù)據(jù)有關(guān)。

從以上的幾個例子不難發(fā)現(xiàn)類的大?。?br>1.為類的非靜態(tài)成員數(shù)據(jù)的類型大小之和
2.有編譯器額外加入的成員變量的大小,用來支持語言的某些特性(如:指向虛函數(shù)的指針)
3.為了優(yōu)化存取效率,進(jìn)行的邊緣調(diào)整
4.與類中的構(gòu)造函數(shù),析構(gòu)函數(shù)以及其他的成員函數(shù)無關(guān)