1. 程式人生 > >空類的大小是多少?原因是什麼?

空類的大小是多少?原因是什麼?

首先,我們要知道,一個類是沒有大小的,應該說成是類的例項的大小。

class A;
A a;

其中,sizeof(A) == sizeof(a);
一個物件的大小 大於等於所有的非靜態成員大小的總和。
這是為什麼呢?

1.指向虛擬函式表的指標

對於有虛擬函式的類,需要有一個方法為它的實體提供型別資訊和虛擬函式入口,一般的方法是建立一個虛表(虛擬函式表)。在例項化時,在物件中增加一個指向虛擬函式的指標,許多編譯器都是這樣規定的

2. 記憶體對齊

編譯器優化,因為對於大多數CPU來說,CPU字長的整數倍操作起來更快,因此對於這些成員加起來如果不夠這個整數倍,有可能編譯器會插入多餘的內容湊足這個整數倍,此外,有時候相鄰的成員之間也有可能因為這個目的被插入空白,這個叫做記憶體對齊。

sizeof類得到的結果等於各非靜態資料成員(不包括成員函式)的總和加上編譯器額外增加的位元組。後者依賴於不同的編譯器實現,C++標準對此不做任何保證。

一個類中成員函式、虛擬函式、靜態資料成員都是不佔用類的儲存空間的。

空類大小是1不是0的原因?

因為空類也進行了例項化,每個例項在記憶體中都有一個獨一無二的地址,為了達到這個目的,編譯器一般會給一個空類隱含的加一個位元組,這樣就可以達到空類在例項化後得到了獨一無二的地址的目的。

類的大小與什麼有關,與什麼無關?

  • 類的大小是非靜態成員資料的型別大小之和;
  • 為了優化存取效率,進行位元組對齊;
  • 由編譯器額外加入的成員變數的大小,用來支援語言的某些特性;
  • 與類中的建構函式、解構函式、拷貝建構函式、賦值運算子過載、取地址運算、const取地址運算無關。