对于空类的单继承层次结构,是否可以保证大小相等

Is there a guarantee of sizeof equality for a single-inheritance hierarchy of empty classes?

本文关键字:是否 单继承 于空类 层次结构 继承      更新时间:2023-10-16

我有一个状态机的状态类层次结构:

class BaseState
{
public:
  virtual ~BaseState {}
  template<typename ToCompareWith>
  bool in() const
  {
    return (dynamic_cast<const ToCompareWith*>(this) != 0);
  }
};
class SubState : public BaseState {};
class SubSubState : public SubState {};

在我的机器上,sizeof 为所有类返回 4。我想知道这是否一致。我知道它不适用于多重继承,因为内存对齐更复杂。我想知道这一点,因为我想在转换到新状态时使用放置 new(到旧状态内存位置)(当前状态实例存储在基类指针中)。我知道我可以将所有状态的静态存储在某个地方,但这不是这里的重点。

不,不能保证通过从基数派生空类来增加的大小。该标准允许不添加任何尺寸。

请注意,使用 dtor/放置新替换对象仅在显式管理对象时才有效:例如,您无法更改堆栈上普通对象的类型。但是,您可以使用 C++11 个不受限制的联合。您只需列出所有潜在的转换,并在状态更改时销毁/创建合适的成员。这样,您也不依赖于对象大小。

理论上,我不知道

是否所有具有虚函数的空类实例都具有相同的大小。

在实践中,大多数C++实现都在此类实例中使用隐式 vtable 指针,通常该(隐式)_vptr成员的大小是sizeof(void*)

为了符合标准,您可以对所有此类类进行union(假设C++11)。

顺便说一句,您对dynamic_cast的使用可能效率低下。