对于空类的单继承层次结构,是否保证sizeof的大小?

时间:2014-11-15 10:34:40

标签: c++ class inheritance sizeof

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

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。我想知道这是否一致。我知道它不适用于多重继承,因为内存对齐更复杂。我想知道,因为我想在转换到新状态时使用 placement new (进入旧状态内存位置)(当前状态实例存储在基类指针中)。我知道我可以存储我所有州的静态,但这不是重点。

2 个答案:

答案 0 :(得分:1)

不,无法保证通过从基础派生空类来增加大小。该标准允许不添加任何大小。

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

答案 1 :(得分:0)

理论上我不知道具有虚函数的所有空类实例是否具有相同的大小。

实际上,大多数C ++实现在这些实例中使用了隐式vtable指针,通常该(隐式)_vptr成员的大小为sizeof(void*)

要符合标准,你可以制作所有这类的union(假设是C ++ 11)。

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