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

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

#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++作出這樣規定的緣由究竟有什麼道理呢?請看下面這個計算元素個數的例子:spa

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操做。這樣一來,編譯器還須要用一些複雜的代碼來處理這些異常狀況信息。code

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

相關文章
相關標籤/搜索