一、空类占1字节
-
在绝大多数编译器下,一个空类的sizeof结果是1字节。
-
用于保存内存中拥有的唯一地址
二、为什么是1字节
- 在C++中,任何完整的对象在内存中都必须具有唯一的地址
cpp
class Empty {};
int main() {
Empty e1, e2;
std::cout << sizeof(Empty) << std::endl; // 输出:1
std::cout << &e1 << " " << &e2 << std::endl; // 输出两个不同的地址(说明确实占了1字节,地址不同)
}
三、空基类优化(EBO)
-
如果空类作为基类被继承,编译器通常不会为基类对象分配那1字节内存,而是直接复用派生类的空间
-
可以理解为空基类是邮戳,派生类的地址是信封,基类地址在派生类空间内,直接复用。
cpp
class EmptyBase {};
class Derived : public EmptyBase {
int x; // 4 字节(不考虑对齐)
};
int main() {
std::cout << sizeof(EmptyBase) << std::endl; // 输出:1
std::cout << sizeof(Derived) << std::endl; // 输出:4(而不是 5!)
// 编译器没有为 EmptyBase 分配那额外的 1 字节,直接复用了 Derived 的空间。
}
四、有虚函数的基类,大小不是1字节
- 因为虚函数会创建虚表指针,大小不是1
cpp
class EmptyWithVFunc {
public:
virtual void foo() {}
};
std::cout << sizeof(EmptyWithVFunc) << std::endl; // 64位输出 8