提问人:ThomasAlvaEdison 提问时间:11/11/2023 更新时间:11/11/2023 访问量:72
C++:多态对象的连续存储器
C++: contigouos memory for polymorphic objects
问:
我目前正在开发一款多人棋盘游戏,并使用简单的 .
但是,我不会在向量中存储具体对象,而只存储指向这些字段对象的指针。
在 C/C++ 文献或互联网上,我经常发现这不应该那么好(出于性能的原因 - >很多缓存未命中)。
我意识到这并没有给我一个线性的、连续的记忆区域,而是字段/对象分散在内存中的某个地方。std::vector<T>
但是,我不知道如何更好地解决这个问题。 特别是因为这些字段是多态的。 换句话说,我有一个基类 cField,字段的专用子类型继承自该基类。
在我的源代码中,它看起来像这样:
class cField
{
public:
uint8_t m_pos{ 0 };
std::string m_name{};
}
class cSpecialField : cField
{
public:
private:
}
class cEventField : cField
{
public:
private:
}
// vector, which manage the memory for all board fields
std::vector< std::unique_ptr<cField> > m_fields;
我要问的问题是,我如何确保内存区域保持连续性,并且我不会丢失多态性。 从游戏控制器的角度来看,基类 cField 充当一个接口,通过该接口,我可以访问所有字段共有的泛型方法。我可以轻松地遍历所有字段等。
可能是解决方案吗?
它是这样的,例如:std::variant<T>
std::vector< std::variant<cSpecialField , cEventField> > m_fields
但我在某处读到,可能会浪费大量存储空间,因为向量随后会为每个元素使用变体的最大数据类型。 那也不理想......
谢谢!!
答: 暂无答案
评论