为什么要对通过 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 来说很昂贵(甚至不可能),另一个是您不希望指向各个原型的指针因更改而失效到矢量,
我正在研究 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 来说很昂贵(甚至不可能),另一个是您不希望指向各个原型的指针因更改而失效到矢量,