https://blog.csdn.net/lihao21/article/details/47973609
本文中所說是C++的空類是指這個類不帶任何數據,即類中沒有非靜態(non-static)數據成員變量,沒有虛函數(virtual function),也沒有虛基類(virtual base class)。?
直觀地看,空類對象不使用任何空間,因為沒有任何隸屬對象的數據需要存儲。然而,C++標準規定,凡是一個獨立的(非附屬)對象都必須具有非零大小。換句話說,
C++空類的大小不為0
為了驗證這個結論,可以先來看測試程序的輸出。
#include <iostream>
using namespace std;class NoMembers
{
};int main()
{NoMembers n; // Object of type NoMembers.cout << "The size of an object of empty class is: "<< sizeof(n) << endl;
}
輸出:
The size of an object of empty class is: 1
C++標準指出,不允許一個對象(當然包括類對象)的大小為0,不同的對象不能具有相同的地址。這是由于:
- new需要分配不同的內存地址,不能分配內存大小為0的空間
- 避免除以 sizeof(T)時得到除以0錯誤
故使用一個字節來區分空類。
值得注意的是,這并不代表一個空的基類也需要加一個字節到子類中去。這種情況下,空類并不是獨立的,它附屬于子類。子類繼承空類后,子類如果有自己的數據成員,而空基類的一個字節并不會加到子類中去。例如,
class Empty {};
struct D : public Empty {int a;};
sizeof(D)為4。
再來看另一種情況,一個類包含一個空類對象數據成員。
class Empty {};
class HoldsAnInt {int x;Empty e;
};
在大多數編譯器中,你會發現 sizeof(HoldsAnInt) 輸出為8。這是由于,Empty類的大小雖然為1,然而為了內存對齊,編譯器會為HoldsAnInt額外加上一些字節,使得HoldsAnInt被放大到足夠又可以存放一個int。
參考資料?
1.?http://www.stroustrup.com/bs_faq2.html#sizeof-empty?
2.?https://msdn.microsoft.com/en-us/library/f42z47h2.aspx?
3.?http://en.cppreference.com/w/cpp/language/sizeof?
4. Effective C++, Third Edition, Scott Meyers著, 侯捷譯