我有状态机的状态类层次结构:
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 (进入旧状态内存位置)(当前状态实例存储在基类指针中)。我知道我可以存储我所有州的静态,但这不是重点。
答案 0 :(得分:1)
不,无法保证通过从基础派生空类来增加大小。该标准允许不添加任何大小。
请注意,只有在显式管理对象时,才能使用dtor / placement new替换对象:例如,您无法更改堆栈上普通对象的类型。但是,您可以使用C ++ 11不受限制的联合。您只需列出所有潜在的转换,并在状态更改时销毁/创建合适的成员。这样,您也不依赖于对象大小。
答案 1 :(得分:0)
理论上我不知道具有虚函数的所有空类实例是否具有相同的大小。
实际上,大多数C ++实现在这些实例中使用了隐式vtable指针,通常该(隐式)_vptr
成员的大小为sizeof(void*)
要符合标准,你可以制作所有这类的union
(假设是C ++ 11)。
顺便说一句,您对dynamic_cast
的使用可能效率低下。