C/C++—— C++中一個空物件為什麼還要佔用一個位元組空間

readyao發表於2016-04-01

C++中一個空物件為什麼還要佔用一個位元組空間?

先看一個例項輸出結果:

#include <iostream>
using namespace std;

//一個空類
class Empty{


};

int main()
{
    Empty e;
    cout << "sizeof(e) = " << sizeof(e) << endl;

    return 0;
}

輸出結果為:sizeof(e) = 1
從輸出結果可以看出一個空的物件佔有的記憶體空間大小為1個位元組。
但是經過測試一個空的string物件佔有的記憶體空間大小為8個位元組。

分析原因:

1.標準對此的確有規定,但沒有明確規定空物件一定要是1位元組,標準只是規定了物件的大小必須大於0,首先標準中有如下標定“An object is a region of storage. ”。
2.顯然不存在0位元組長度的儲存區域,這句話隱含了空物件是大於0的,另外還有標定“a most derived object shall have a non-zero size and shall occupy one or more bytes of storage. Base class sub-objects may have zero size. An object of POD contiguous bytes of storage.”,
說明了最終派生物件大小是非0值,其大小可以是1或多個位元組,基類子物件可以為0(任何可直接建立的物件都不會為0,如果一個類A是個空類,那麼直接建立物件的時候大小為1,如果B類從A類派生並且沒有額外的資料成員,那麼直接建立B類時大小依然為1,規定對基類子物件可為0的規定使的編譯器會進行空基類優化)。
3.最後在關於sizeof操作符中也有相關規定“The size of a most derived class shall be greater than zero ”,可見規定的確規定了空物件大小不能為0的現實,但卻不強制其大小一定為1(這為編譯器為不同的作業系統進行優化留有餘地,比如說在不同字長[8,16,32,64]位CPU下,最有效率的運算元型別都是CPU的字長,那麼編譯器可以選擇機器字長來作為不為0時的最小長度)。

下面是在知乎上該問題的回答:
C++ 中空類物件為什麼佔一個位元組?

回答1:
因為空class的sizeof就是1。
class的sizeof不能為0,因為需要能允許把 class 例項放到陣列裡。如果sizeof是0,那麼陣列的sizeof呢,也是0?那麼陣列裡有多少個元素呢?0/0?無窮多或N/A個?
這就沒法玩了。所以空class的sizeof必須是1,這樣還節省記憶體呢.

回答2:
因為如果是4或8位元組的話,又會有人問為什麼不是1位元組,多浪費空間啊。
還有更狠的問法:居然sizeof(class A{}) > sizeof(class B{char c;}),設計者腦抽了吧!

相關文章