說明
- 編譯器為不含任何成員的空類分配大小為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