C++空類及沒有成員變量的類的大小實例分析
眾所周知的C++中空類的大小為1,但是除了空類之外的其他一些沒有成員變量的類的大小,還是有相當一部分開發(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í)行的輸出結果為:
sizeof(a)=1 sizeof(b)=1 sizeof(c)=4 sizeof(d)=8
為什么會出現(xiàn)這種結果呢?初學者肯定會對此疑惑不解,類a,b明明是空類,它的大小應該為為0,為什么編譯器輸出的結果為1呢?這就是我們剛才所說的實例化的原因(空類同樣可以被實例化),每個實例在內存中都有一個獨一無二的地址,為了達到這個目的,編譯器往往會給一個空類隱含的加一個字節(jié),這樣空類在實例化后在內存得到了獨一無二的地址,所以a,b的大小為1。
而類c是由類a派生而來,它里面有一個純虛函數(shù),由于有虛函數(shù)的原因,有一個指向虛函數(shù)表的指針(vptr,有多個虛函數(shù)仍然是只有一個指針),在32位的系統(tǒng)分配給指針的大小為4個字節(jié),所以最后得到c類的大小為4。
類d的大小更是會讓很多的初學者疑惑,類d是由類b,c派生而來的,它的大小應該為二者之和5,為什么卻是8呢?這是因為為了提高實例在內存中的存取效率,內存中會有數(shù)據(jù)對齊,于是類的大小往往被調整到4字節(jié)的整數(shù)倍。并采取就近的法則,往大的方向取最近的倍數(shù),就是該類的大小,所以類d的大小為8個字節(jié)(假如d由3個空類和c派生而來,仍然是8)。
相關文章
C++ 中pragma once 與 #ifndef _XXX_H_ #define _XXX_H_的區(qū)別
這篇文章主要介紹了C++ 中pragma once 與 #ifndef _XXX_H_ #define _XXX_H_的區(qū)別的相關資料,需要的朋友可以參考下2017-04-04