C 空類以及沒有成員變數的類的大小

2022-04-29 14:18:10 字數 884 閱讀 5445

關於c++中空類的大小為1,我們大家都有所了解,但是除了空類之外的其他一些沒有成員變數的類的大小,還是有很多不明之處的。

#include

usingnamespacestd;

classa{};

classb{};

classc:publica;

classd:publicb, publicc{};

intmain()

程式執行的輸出結果為:

sizeof(a)=1

sizeof(b)=1

sizeof(c)=4

sizeof(d)=8

為什麼會出現這種結果呢?初學者肯定會很煩惱是嗎?類a,b明明是空類,它的大小應該為為0,為什麼 編譯器輸出的結果為1呢?這就是我們剛才所說的例項化的原因(空類同樣可以被例項化),每個例項在記憶體中都有乙個獨一無二的位址,為了達到這個目的,編譯器往往會給乙個空類隱含的加乙個位元組,這樣空類在例項化後在記憶體得到了獨一無二的位址,所以a,b的大小為1。

而類c是由類a派生而來,它裡面有乙個純虛函式,由於有虛函式的原因,有乙個指向虛函式表的指標(vptr,有多個虛函式仍然是只有乙個指標),在32位的系統分配給指標的大小為4個位元組,所以最後得到c類的大小為4。

類d的大小更讓初學者疑惑吧,類d是由類b,c派生而來的,它的大小應該為二者之和5,為什麼卻是8呢?這是因為為了提高例項在記憶體中的訪問效率,記憶體中會有資料對齊,於是類的大小往往被調整到4位元組的整數倍。並採取就近的法則,往大的方向取最近的倍數,就是該類的大小,所以類d的大小為8個位元組(假如d由3個空類和c派生而來,仍然是8)。

當然在不同的編譯器上得到的結果可能不同,但是這個實驗告訴我們,不管類是否為空類,是否有成員變數,這個類在建立物件的時候都是需要分配空間的(sizeof的作用見我另外一篇博文:

C 空類及沒有成員變數的類的大小例項分析

眾所周知的c 中空類的大小為1,但是除了空類之外的其他一些沒有成員變數的類的大小,還是有相當一部分開發人員對此有很多不明之處的。這裡我們以如下 為例 includ程式設計客棧e using namespace std class a class b class c 程式設計客棧 public a c...

C 類的私有成員變數和函式的隱藏

我們在寫c 的 的時候,尤其是給三方提供庫的情況下,所提供的類標頭檔案中包含了很多的私有的變數和函式,對於呼叫和開發的人來說都是很繁瑣的一件事情,最近在寫qt 的時候發現對其私有的東西隱藏很好,仔細研究,其實就是對這個類提供乙個私有的類,然後通過巨集對這個類進行使用,非常方便。首先定義巨集,如vc編...

私有成員變數的訪問(類內與類外)

1 class ctest 1011 ctest ctest int i value i 1215 16 ctest ctest const ctest rhs value rhs.value 1720 21 ctest ctest operator const ctest rhs 2229 30v...