说明
- 编译器为不含任何成员的空类分配大小为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