C++空類大小


為什么C++ 中空類的大小是1個字節?

1、對於結構體和空類大小是 1個字節 這個問題,首先這是一個C++問題,在C語言下空結構體大小為0 (當然這是編譯器相關的)。這里的空類和空結構體是指類或結構體中沒有任何成員。

2、在C++下,空類和空結構體的大小是1(編譯器相關),這是為什么呢?為什么不是0?

3、這是因為,C++標准中規定,“no object shall have the same address in memory as any other variable” ,就是任何不同的對象不能擁有相同的內存地址。 如果空類大小為0,若我們聲明一個這個類的對象數組,那么數組中的每個對象都擁有了相同的地址,這顯然是違背標准的。

4、但是,也許你還有一個疑問,為什么C++標准中會有這么無聊的規定呢?

當然,這樣規定顯然是有原因的。我們假設C++中有一個類型T,我們聲明一個類型T的數組,然后再聲明一個T類型的指針指向數組中間某個元素,則我們將指針減去1,應該得到數組的另一個索引。如下代碼:

T array[5];

int diff = &array[3] - &array[2];

// diff = 1

  

上面的代碼是一種指針運算,將兩個指針相減,編譯器作出如下面式子所示的動作:

 

diff = ((char *)&array[3] - (char *)&array[2]) / sizeof(T);

 

  

 

式子應該不難懂吧,很明顯的一點就是這個式子的計算依賴於 sizeof(T)。雖然上面只是一個例子,但是基本上所有的指針運算都依賴於sizeof(T)。

好,下面我們來看,如果 允許不同的對象有相同的地址將會引發什么樣的問題,看下面的例子:

&array[4] - &array[3] = &array[4] - &array[2]
= &array[4] - &array[1]
= &array[4] - &array[0]
= 0

  

我們可以看到,在這個例子中:

(1)如果每個對象都擁有相同地址,我們將沒有辦法通過指針運算來區分不同的對象。

(2)還有一個更嚴重的問題,就是如果 sizeof (T)是 0,就會導致編譯器產生一個除 0 的操作,引發不可控的錯誤。

基於這個原因,如果允許結構體或者類的大小為0,編譯器就需要實現一些復雜的代碼來處理這些異常的指針運算。

5、所以,C++標准規定不同的對象不能擁有相同的地址。

那么怎樣才能保證這個條件被滿足呢?

最簡單的方法莫過於不允許任何類型的大小為 0。所以編譯器為每個空類或者空結構體都增加了一個虛設的字節(有的編譯器可能加的更多),這樣這些空類和空結構的大小就不會是0,就可以保證他們的對象擁有彼此獨立的地址。

————————————————
版權聲明:本文為CSDN博主「風暴計划」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/cmm0401/article/details/77155620


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM