類的內存分配簡單總結函數
代碼片斷以下:this
class ClassAspa
{指針
private:對象
int A;繼承
int B;內存
void prin1()作用域
{編譯器
}編譯
void prin2()
{
}
virtual void prin3()
{
}
};
class ClassB:public ClassA
{
public:
int C;
int D;
void prin4()
{
}
void prin5()
{
}
virtual void prin6()
{
}
};
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(ClassA)<<endl;
cout<<sizeof(ClassB)<<endl;
return 0;
}
結果是12
20;
結果爲何是這樣?
32位系統int佔4個字節,而一個類中全部的虛函數經過一個虛函數指針管理,類對象的大小隻包含這個vptr指針,其餘虛函數是放在別的內存空間中管理,vptr指針也是4個字節大小。注意到普通成員函數並不佔類對象的大小空間,由於普通成員函數經過this指針管理,一個對象的this指針並非對象自己的一部分,不會影響sizeof(對象)的結果。this做用域是在類內部,當在類的非靜態成員函數中訪問類的非靜態成員的時候,編譯器會自動將對象自己的地址做爲一個隱含參數傳遞給函數。這個this指針會因編譯器不一樣而有不一樣的放置位置,多是棧,也多是寄存器,甚至全局變量。子類其實無論如何繼承,用sizeof()算該類的大小都會把父類中的私有成員變量所佔的空間算進去,也就是說,私有變量也在子類中分配了類存,但你卻不能夠直接訪問,這起到一個保護做用,我感受這如同一個珠寶,共有繼承就是開放性的展覽,而私有繼承是把珠寶鎖起來,你卻不能動,要動珠寶若是有管家(基類的public中定義了一些對其私有變量操做的成員函數,)只能讓管家幫你代勞。因此基類就得出了12子類就得出了20。