C++空類及沒有成員變量的類的大小實(shí)例分析
眾所周知的C++中空類的大小為1,但是除了空類之外的其他一些沒有成員變量的類的大小,還是有相當(dāng)一部分開發(fā)人員對此有很多不明之處的。
這里我們以如下代碼為例:
#include using namespace std; class a {}; class b{}; class c :public a{ virtual void fun() = 0; }; class d :public b, public c{}; int main() { cout << "sizeof(a)" << sizeof(a) << endl; cout << "sizeof(b)" << sizeof(b) << endl; cout << "sizeof(c)" << sizeof(c) << endl; cout << "sizeof(d)" << sizeof(d) << endl; getchar(); return 0; }
程序執(zhí)行的輸出結(jié)果為:
sizeof(a)=1 sizeof(b)=1 sizeof(c)=4 sizeof(d)=8
為什么會(huì)出現(xiàn)這種結(jié)果呢?初學(xué)者肯定會(huì)對此疑惑不解,類a,b明明是空類,它的大小應(yīng)該為為0,為什么編譯器輸出的結(jié)果為1呢?這就是我們剛才所說的實(shí)例化的原因(空類同樣可以被實(shí)例化),每個(gè)實(shí)例在內(nèi)存中都有一個(gè)獨(dú)一無二的地址,為了達(dá)到這個(gè)目的,編譯器往往會(huì)給一個(gè)空類隱含的加一個(gè)字節(jié),這樣空類在實(shí)例化后在內(nèi)存得到了獨(dú)一無二的地址,所以a,b的大小為1。
而類c是由類a派生而來,它里面有一個(gè)純虛函數(shù),由于有虛函數(shù)的原因,有一個(gè)指向虛函數(shù)表的指針(vptr,有多個(gè)虛函數(shù)仍然是只有一個(gè)指針),在32位的系統(tǒng)分配給指針的大小為4個(gè)字節(jié),所以最后得到c類的大小為4。
類d的大小更是會(huì)讓很多的初學(xué)者疑惑,類d是由類b,c派生而來的,它的大小應(yīng)該為二者之和5,為什么卻是8呢?這是因?yàn)闉榱颂岣邔?shí)例在內(nèi)存中的存取效率,內(nèi)存中會(huì)有數(shù)據(jù)對齊,于是類的大小往往被調(diào)整到4字節(jié)的整數(shù)倍。并采取就近的法則,往大的方向取最近的倍數(shù),就是該類的大小,所以類d的大小為8個(gè)字節(jié)(假如d由3個(gè)空類和c派生而來,仍然是8)。
您可能感興趣的文章


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 01-11ajax實(shí)現(xiàn)頁面的局部加載
- 04-02jquery與jsp,用jquery
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10delphi制作wav文件的方法
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置