C++中的空類與空結構體大小


  今天面試遇到了一個很有意思的問題,即空結構體在C++中所占的內存大小是多少?參見如下代碼:

#include <iostream>
struct S0
{ 
};

int main()
{
    std::cout << sizeof S0 << std::endl;
    return 0;
}

  面試官當場提醒了我一下,說如果S0對象所占用的內存大小為0,那么將可以申請無限多個此類型的對象數組,並且大小永遠為0。我當時覺得有點道理,不過轉念一想,還是有點疑惑。

  回來研究了一下,原來在C++語言中的確規定了空結構體和空類所占內存大小為1,而C語言中空類和空結構體占用的大小是0(在gcc中測試為0,其他編譯器不一定)。由此又產生了一個新的疑問:為什么C++會有這樣的規定呢?

  原來,C++語言標准中規定了這樣一個原則:“no object shall have the same address in memory as any other variable”,即任何不同的對象不能擁有相同的內存地址。如果空類對象大小為0,那么此類數組中的各個對象的地址將會一致,明顯違反了此原則。

  進一步地,C++做出這樣規定的原因究竟有什么道理呢?請看下面這個計算元素個數的例子:

T array[5];
int count = &array[4] - &array[0];

  這種指針相減的運算在編譯器中會等價於如下步驟:

count = ((char *)&array[4] - (char *)&array[0]) / sizeof T;

  如果允許C++對象大小為0,那么這里的運算將產生兩個問題:(1)能通過指針區分不同的數組對象(2)sizeof T為0導致非法的除0操作。這樣一來,編譯器還需要用一些復雜的代碼來處理這些異常情況信息。

  為了滿足C++標准規定的不同對象不能有相同地址,C++編譯器保證任何類型對象大小不能為0。C++編譯器會在空類或空結構體中增加一個虛設的字節(有的編譯器可能不止一個),以確保不同的對象都具有不同的地址。


免責聲明!

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



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