空基类优化
对象不能占用少于 1 个字节,因为这种类型的数组的成员将具有相同的地址。因此,sizeof(T)>=1
总是成立。派生类也不能小于其任何基类。但是,当基类为空时,其大小不一定会添加到派生类中:
class Base {};
class Derived : public Base
{
public:
int i;
};
在这种情况下,不需要在 Derived
中为 Base
分配一个字节,以便为每个对象的每种类型分配一个不同的地址。如果执行空基类优化(并且不需要填充),则 sizeof(Derived) == sizeof(int)
,即,不对空基进行额外分配。这也适用于多个基类(在 C++中,多个基数不能具有相同的类型,因此不会产生任何问题)。
请注意,只有当 Derived
的第一个成员的类型与任何基类不同时,才能执行此操作。这包括任何直接或间接的共同基础。如果它与其中一个基础(或者有一个公共基础)的类型相同,则至少需要分配一个字节,以确保相同类型的两个不同对象不具有相同的地址。