对于空类的单继承层次结构,是否可以保证大小相等
Is there a guarantee of sizeof equality for a single-inheritance hierarchy of empty classes?
我有一个状态机的状态类层次结构:
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
的使用可能效率低下。
相关文章:
- 检查类是否在继承层次结构中显式定义了成员类型
- 是C 单继承的内存布局与此C代码相同
- 在继承期间,基类的基类是否也继承?
- 是否可以继承QVBoxLayout并将其设置为QWidget中的布局
- 是否可以继承模板类并将类型设置为当前尝试从中继承的类的模板化子类?
- 添加插件 SDK - 是否多重继承
- 是否可以继承默认的IShellFolder实现
- 对于空类的单继承层次结构,是否可以保证大小相等
- 如何确定一个类是否间接继承自基类
- 通过克隆创建的子项是否会继承其父级的 CPU 关联掩码?
- c++是否可以继承一个类,但不能继承该类继承的内容?(qt)
- 派生类是否间接继承基的赋值运算符?
- 函数是否可以继承参数
- 在c++中,如何确定一个类是否是继承链中的最后一个类/子类?它位于基类的另一端
- c++,单继承,垃圾值
- 是否可以继承赋值操作符?
- 模板和不透明指针是否在继承上不兼容
- 构造函数主体前面的冒号是否表示继承
- 如何在编译时检查类是否具有继承的函数
- 是否通过继承层次结构dynamic_casting不良做法