首页 > 解决方案 > 为什么你会为你将通过 std::vector 引用的对象使用堆分配?

问题描述

我正在阅读这篇文章中关于游戏编程中的 ECS 系统的一些代码 并试图理解它,我经常看到的是在似乎没有任何好处的地方使用堆内存。以此为例:

class ECS
{
public:
    void someFunction()
    {
        archetypes.push_back(new Archetype);
    }
    ~ECS()
    {
        for(Archetype* a : archetypes_)
        {
            delete a;
        }
    }
private:
    std::vector<Archetype*> archetypes_;
};

这是在代码中在内存中操作原型的唯一方法。这里也没有涉及多态性。堆上的原型似乎对代码没有影响,除了原型被指针引用的事实。

为什么你会选择为此使用分配的内存?我经常在代码中看到这一点,在我看来,使用堆内存只是因为感觉是正确的做法,而不是真正考虑它是否适合它。std::vector已经在后台使用堆内存,所以当我们想要添加新原型时,为什么不直接将堆栈变量复制到向量中,让向量处理分配呢?

class ECS
{
public:
    void someFunction()
    {
        archetypes.push_back(Archetype());
    }
private:
    std::vector<Archetype> archetypes_;
};

或者在这种情况下使用堆内存有正当理由吗?

标签: c++heap-memorynew-operatordelete-operator

解决方案


明显的原因是您不希望在矢量增长时移动/复制数据项,

这可能有几个原因,一个是移动/复制类型很昂贵(甚至不可能),另一个是您不希望指向单个原型的指针因向量的更改而失效,


推荐阅读