char 大小 空類的大小

2021-10-11 06:39:31 字數 1988 閱讀 3514

通過菱形繼承關係討論在繼承體系中不同繼承的情況,base類和derive類的尺寸。

class
類之間的關係,用圖表示如下:

在普通public繼承的體系下,上述繼承關係如下:

在這種繼承體系下,所有的derived類都以public的形式繼承自base類。通過程式得到不同平台下的大小:

繼承體系下所有的empty類都佔 1 byte。

在windows平台下,所有empty(空)類的大小都為1。對於編譯器來說,為了給類的不同物件分配唯一乙個儲存空間,會為空類安插乙個char即 1 byte。

使用gcc編譯器編譯測試的類的size結果:

在繼承體系下,empty類佔 1 byte;單繼承的empty類佔 1 byte;多繼承的empty類佔 2 byte。

class size:

base class: 1

subbase1 class: 1

subbase2 class: 1

derive class: 2

a. base類的大小為1,因為base類是乙個empty類,編譯器自動為其安插1個char即 1 byte;

b. subbase1類的大小為1, 因為subbase1類繼承自base類(乙個empty類),由於base類有1 byte的空間,所以在subbase1中有1 byte存放base子類。又由於subbase1是empty類佔 0 byte。綜上所屬,subbase1佔 1 byte。

c. 同理,subbase2也占用 1 byte;

d. derive類的大小為 2 byte。subbase1和subbase2分別佔 1 byte。由於derive類是empty類佔 0 byte。綜上所述,空的derive類的大小是 2 byte, 結構如下所示:

在虛繼承體系中,subbase1和subbase2以virtual繼承的方式繼承自base類,其繼承結構如下:

在虛繼承的體系下,無論windows平台還是gnu-gcc的編譯環境下,結果相同:

在 64 bit的platform下,empty類佔 1 byte;單繼承的empty類佔 8 byte; 多繼承的empty類佔 16 byte。

a. base類由編譯器分配的 1 byte;

b. subbase1類的 8 bytes 和subbase2類的 8 bytes, 共佔 16 byte;

c. derive類是empty類佔 0 byte;

綜上所述,當前情況下derive類佔 17 byte, 由於alinment(位元組序對齊)的作用,編譯器會為derive類新增 7 bytes( 對於64 bit作業系統,8 byte對齊 )來滿足位元組對齊。由於編譯器優化的作用,base類是derive類的一部分不佔額外的空間,因此,編譯器不為base類分配 1 byte的佔位符。此時,derive類佔 16 bytes,結構如下:

sizeof 類大小,空類大小

乙個類的例項化物件所佔空間的大小?注意不要說類的大小,是類的物件的大小.首先,類的大小是什麼?確切的說,類只是乙個型別定義,它是沒有大小可言的。用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。如果 class a a obj 那麼sizeof a sizeof obj 那麼siz...

sizeof 類大小,空類大小

乙個類的例項化物件所佔空間的大小?注意不要說類的大小,是類的物件的大小.首先,類的大小是什麼?確切的說,類只是乙個型別定義,它是沒有大小可言的。用sizeof運算子對乙個型別名操作,得到的是具有該型別實體的大小。如果 class a a obj 那麼sizeof a sizeof obj 那麼siz...

C 空類大小

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