C++的類存儲空間

最近在翻Bjarne Stroustrup的《C++程序設計語言》,如他所說,C++在設計時拒絕了要求必須在每個對象裏存儲某種“簿記信息”,今天特意做了下試驗:

 

 

 

我用windows7 32bit 下的 Dev-C++  4.9.9.2版進行編譯連接,編譯器用的是g++(dev默認),編譯器什麼版本不太清楚。

 

得到結果如下:

----------------------------

 

size of CTestA: 1

size of CTestA_comp: 4

size of CTestB: 1

size of CTestC: 4

size of CTestD: 8

 

----------------------------

 

可見空類還是佔了1個字節的空間,這裏不是很理解,於是網上找了下答案,這裏有種說法是:

“空類佔字節是爲了區分同類的不同對象” (http://topic.csdn.net/u/20091114/22/6a4eba99-4562-44c9-8ef0-9565f39fc015.html)見一樓。

另外這裏更加詳細一些:http://www.cppblog.com/windcsn/archive/2011/04/15/144174.html (C++中結構體和類有大量相似點)

這裏更加本質:http://www.spongeliu.com/clanguage/why-not-null/

 

那麼爲什麼非空類就不需要這個字節呢?還是實際上產生了一個字節的內存消耗,但通過類內部優化來記錄,或者是乾脆在內存其他地方申請了這個空間交給C++Runtime或者操作系統管理呢?

 

我爲前者設計了CTestA_comp類,將x的值設爲最大,這樣大概就無法通過壓縮空間來塞進這1個字節了。結果證明,依然只有一個int的開銷,看來後者可能性居多。不過既是這樣,那麼Stroustrup關於C++不要求“每個”對象都必須存儲某種簿記信息的說法就得到驗證了。

 

CTestB類用於驗證類中是否存儲成員函數的相關信息,結果顯示是1。看來普通成員函數的信息並不存儲在類信息中,如果把CTestB進行實例化,再進行測量會得到一樣的結果。應該也是交由其他某種機制去管理了。

 

CTestC類的意圖主要是爲了測試虛表的。已知定義或繼承了虛函數的類會產生一個隱藏的虛表指針vptr,爲了進一步驗證帶虛函數的類的特點,後來我把兩個虛函數改成純虛函數(即去掉()並加上=0),得到佔用空間依然是4,可見無論是否是純虛函數,還是帶實現的虛函數,都會存在虛表,並佔用4字節空間。由於對指針類型瞭解的並不詳細,後來我又做實驗測量幾乎所有指針類型的長度,得到的結果一律是4。

 

CTestD類是爲了測量成員變量中出現非整形或指針的情況而設計的,結果顯示,該編譯環境下除了空類佔用1以外,其餘情況類會自動向4字節進行內存補齊(超過4變成8,超過8變成12...)。

 

另外網友普遍推薦《Inside the C++ Object Model》,看來有空還是得研究下。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章