c++ - 为什么你会为你将通过 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_;
};
或者在这种情况下使用堆内存有正当理由吗?
解决方案
明显的原因是您不希望在矢量增长时移动/复制数据项,
这可能有几个原因,一个是移动/复制类型很昂贵(甚至不可能),另一个是您不希望指向单个原型的指针因向量的更改而失效,
推荐阅读
- javascript - 使用 php 值提交
- php - 如何将多个文件名发送到数据库并将文件移动到文件夹?代码点火器
- ios - NSLinguisticTagger:根据标签类型过滤掉指定的标记
- javascript - 我的 if 和 else 语句总是认为它是 -and
- mongodb - mongodb聚合,对象中的groupby列表
- angular - 为什么 Angular input [value] = "function()" 运行多次?
- bash - bash 中的问题
- python - 通过 scapy 读取 pcap 并获取特定值
- sql - 如何在sql中按最新日期获取用户名的最新记录
- angular - 打开组件时触发事件