本文中所說是c++的空類是指這個類不帶任何資料,即類中沒有非靜態(non-static)資料成員變數,沒有虛函式(virtual function),也沒有虛基類(virtual base class)。
直觀地看,空類物件不使用任何空間,因為沒有任何隸屬物件的資料需要儲存。然而,c++標準規定,凡是乙個獨立的(非附屬)物件都必須具有非零大小。換句話說,
c++空類的大小不為0為了驗證這個結論,可以先來看測試程式的輸出。
#include usingnamespace
std;
class
nomembers
;int
main()
輸出:
the size of an object of empty class is: 1故使用乙個位元組來區分空類。
值得注意的是,這並不代表乙個空的基類也需要加乙個位元組到子類中去。這種情況下,空類並不是獨立的,它附屬於子類。子類繼承空類後,子類如果有自己的資料成員,而空基類的乙個位元組並不會加到子類中去。例如,
classempty {};
struct d : public empty ;
sizeof(d)為4。
再來看另一種情況,乙個類包含乙個空類物件資料成員。
classempty {};
class
holdsanint ;
在大多數編譯器中,你會發現 sizeof(holdsanint) 輸出為8。這是由於,empty類的大小雖然為1,然而為了記憶體對齊,編譯器會為holdsanint額外加上一些位元組,使得holdsanint被放大到足夠又可以存放乙個int。
參考資料
1. 2.
3. 4. effective c++, third edition, scott meyers著, 侯捷譯
C 空類大小
class a class b class c public a class d public b,public c 類a,b明明是空類,它的大小應該為為 為什麼 編譯器輸出的結果為 呢?這就是我們剛才所說的例項化的原因 空類同樣可以被例項化 每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目...
c 空類的大小
初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的 與最終生編譯成的 卻 大相徑庭,我們並不知道編譯器在後台做了什麼工作 這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗...
c 空類的大小
定義乙個空類,沒有資料 class empty class test2 private empty private繼承 class test3 public empty public繼承 int tmain int argc,tchar argv cout class test1 class tes...