說明
- 編譯器為不含任何成員的空類分配大小為1的空間,這樣空類定義的變量地址不會與其相鄰定義的變量地址相同。
- 編譯器會在空類的子類中優化掉這多分配的空間。
- 帶虛析構函數的空類不是嚴格意義的空類,它包含虛函數表指針,因此其大小為指針的大小。
實驗代碼
/**
* @file empty_size.cpp
* @brief 測試空類的大小
* @copyright public domain
*/
#include<iostream>
class Empty { };
class SubEmpty : public Empty
{
protected:
int mInt;
};
class VEmpty
{
public:
virtual ~VEmpty() = 0;
};
int main()
{
std::cout << "Empty class: " << sizeof(Empty) << std::endl;
std::cout << "SubEmpty: " << sizeof(SubEmpty) << std::endl;
std::cout << "VEmpty: " << sizeof(VEmpty) << std::endl;
std::cout << "Void*: " << sizeof(void*) << std::endl;
return 0;
};
運行及結果
> g++ empty_size.cpp
> a.exe
Empty class: 1
SubEmpty: 4
VEmpty: 8
Void*: 8