C/C++—— C++中一個空物件為什麼還要佔用一個位元組空間
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;}),設計者腦抽了吧!
相關文章
- 【HotSpot】一個java物件佔多少空間HotSpotJava物件
- C++基礎:什麼是名稱空間C++
- 檢視一個User所有物件佔用的空間大小物件
- C++名稱空間C++
- C++ 名稱空間C++
- 為什麼迴圈佇列要浪費一個儲存空間佇列
- GBase 8a中一個字元佔用位元組數說明字元
- C++陣列的儲存|C++陣列所佔記憶體空間C++陣列記憶體
- C++ 中名稱空間的 5 個常見用法C++
- Java陣列物件佔用多少個位元組?Java陣列物件
- 【C++】C++的位元組對齊C++
- c++系列:匿名名稱空間C++
- IMPDP 多個表空間物件匯入到一個表空間中物件
- Oracle檢視物件佔用空間Oracle物件
- 計算一個表佔用的空間的大小
- C++基礎::為什麼不能cout一個string?C++
- 為什麼 C++ 中成員函式指標是 16 位元組?C++函式指標
- C++是什麼意思,為什麼叫C++?C++
- C++中struct的空間計算C++Struct
- C++系列: 巢狀名稱空間C++巢狀
- C++名稱空間的使用 (轉)C++
- c/c++ 位元組對齊C++
- C/C++位元組詳解C++
- C++ 位元組對齊C++
- 為啥要繼承一個空介面繼承
- JAVA——一個漢字佔用多少位元組?Java
- C++中一個名字查詢的小知識C++
- C++筆記--名字空間和異常C++筆記
- 如何檢查一個物件是否為空物件
- JS——判斷一個物件是否為空JS物件
- linux 列出一個目錄佔用的空間 du (轉)Linux
- 【C/C++】5.位元組對齊和位元組填充C++
- C++類和物件是什麼?C++類和物件詳解C++物件
- C和C++中的名字空間和作用域C++
- 深入淺出空間索引:為什麼需要空間索引索引
- 遷移使用者物件從一個表空間到另外表空間物件
- 我為什麼還要造一個前端輪子?前端
- 判斷一個物件為空物件的5種方法物件