空類的大小是多少?原因是什麼?
阿新 • • 發佈:2019-01-30
首先,我們要知道,一個類是沒有大小的,應該說成是類的例項的大小。
class A;
A a;
其中,sizeof(A) == sizeof(a);
一個物件的大小 大於等於所有的非靜態成員大小的總和。
這是為什麼呢?
1.指向虛擬函式表的指標
對於有虛擬函式的類,需要有一個方法為它的實體提供型別資訊和虛擬函式入口,一般的方法是建立一個虛表(虛擬函式表)。在例項化時,在物件中增加一個指向虛擬函式的指標,許多編譯器都是這樣規定的
2. 記憶體對齊
編譯器優化,因為對於大多數CPU來說,CPU字長的整數倍操作起來更快,因此對於這些成員加起來如果不夠這個整數倍,有可能編譯器會插入多餘的內容湊足這個整數倍,此外,有時候相鄰的成員之間也有可能因為這個目的被插入空白,這個叫做記憶體對齊。
sizeof類得到的結果等於各非靜態資料成員(不包括成員函式)的總和加上編譯器額外增加的位元組。後者依賴於不同的編譯器實現,C++標準對此不做任何保證。
一個類中成員函式、虛擬函式、靜態資料成員都是不佔用類的儲存空間的。
空類大小是1不是0的原因?
因為空類也進行了例項化,每個例項在記憶體中都有一個獨一無二的地址,為了達到這個目的,編譯器一般會給一個空類隱含的加一個位元組,這樣就可以達到空類在例項化後得到了獨一無二的地址的目的。
類的大小與什麼有關,與什麼無關?
- 類的大小是非靜態成員資料的型別大小之和;
- 為了優化存取效率,進行位元組對齊;
- 由編譯器額外加入的成員變數的大小,用來支援語言的某些特性;
- 與類中的建構函式、解構函式、拷貝建構函式、賦值運算子過載、取地址運算、const取地址運算無關。