C++:多态对象的连续存储器

C++: contigouos memory for polymorphic objects

提问人:ThomasAlvaEdison 提问时间:11/11/2023 更新时间:11/11/2023 访问量:72

问:

我目前正在开发一款多人棋盘游戏,并使用简单的 . 但是,我不会在向量中存储具体对象,而只存储指向这些字段对象的指针。 在 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

但我在某处读到,可能会浪费大量存储空间,因为向量随后会为每个元素使用变体的最大数据类型。 那也不理想......

谢谢!!

C++ 性能 内存管理 多态性 stdvector

评论


答: 暂无答案