C 空類,空虛基類處理及類大小

2021-06-23 02:36:56 字數 1053 閱讀 1524

對於乙個空類,編譯器會加入1byte的大小,使得這乙個類的兩個物件在記憶體中有獨一無二的位址。

**如下:

class x {};

class y : public virtual x {};

class z : public virtual x {};

class a : public y, public z {};

每個類的大小:

傳統編譯器對empty virutal base class的處理是放在繼承類的尾部,那麼以上大小

x : 編譯器插入1byte 。為1

y(z):編譯器新增乙個指向虛基類子物件的指標或者乙個相關的**,所以是 4 byte; 但是在加上x的大小,4+1=5,在按照對齊,對齊是按照4bytes對齊,最終是5+3=8;

a:不是y+z=16,因為虛基類子物件在繼承類中只存在乙份例項,而且不管是繼承多少次,所以是乙份x:1, y+z = 4+4 = 8; 對齊之後1+8+3 = 12 bytes

但是新進的編譯器(visual c++和gcc都是這種情況,所以覺得應該慢慢都會這樣),對於empty virtual base class進行了特殊處理,這個類被視為繼承類物件的最開頭的一部分,所以它沒有花費任何空間,也就節省了上面的1byte,同時也節省了y z的3bytes對齊。

所以每個大小

x:1y(z):虛基類在最頂部,不佔空間,4

a:4+4 = 8

課件節省了空間。但如果在虛基類當中放置乙個以上的資料成員,則兩種編譯器會產生完全相同的布局。

c++物件模型中,將非靜態資料成員,不管是自己的還是繼承的直接放在類的每個物件中;對於靜態成員,則放置在乙個全域性資料段中,不會影響個別類的大小,且每個類只存在乙份例項,及時類沒有物件,也有靜態成員。但是乙個模板類的靜態成員行為可能不同。

每個類物件的大小包括非靜態成員,編譯器會加上一些成員(支援各種virtual特性),然後是一些對齊。這三部分得出物件的size.

C 空類大小

class a class b class c public a class d public b,public c 類a,b明明是空類,它的大小應該為為 為什麼 編譯器輸出的結果為 呢?這就是我們剛才所說的例項化的原因 空類同樣可以被例項化 每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目...

c 空基類優化

我們知道c 中乙個空類的大小為1個位元組,那麼如果乙個空類作為基類或者成員物件的時候會怎樣呢,是不是還是一定占用1個位元組呢?c 中為保證同一型別的不同物件位址始終有別,要求任何物件或成員子物件,即使該型別是空的類型別 即沒有非靜態資料成員的 class 或 struct 也是如此。然而,基類子物件...

c 空類的大小

初學者在學習物件導向的程式語言時,或多或少的都些疑問,我們寫的 與最終生編譯成的 卻 大相徑庭,我們並不知道編譯器在後台做了什麼工作 這些都是由於我們僅停留在語言層的原因,所謂語言層就是教會我們一些基本的語法法則,但不會告訴我們為什麼這麼做?今天和大家談的一點感悟就是我在學習程式設計過程中的一點經驗...