为什么要对通过 std::vector 引用的对象使用堆分配?

Why would you ever use heap allocation for objects you will reference through an std::vector?

我正在研究 this article about ECS-systems in game programming 中的一些代码并试图理解它,我经常看到的是在似乎没有任何好处的地方使用堆内存。以此为例:

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_;
};

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

显而易见的原因是当向量增长时,您不希望数据项是 moved/copied,

这可能有几个原因,一个是类型对 move/copy 来说很昂贵(甚至不可能),另一个是您不希望指向各个原型的指针因更改而失效到矢量,