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