向量 .reserve() 和分配效率 (C++)
Posted
技术标签:
【中文标题】向量 .reserve() 和分配效率 (C++)【英文标题】:Vector .reserve() and allocation efficiency (C++) 【发布时间】:2016-11-22 22:41:32 【问题描述】:我正在尝试优化我的游戏中的射弹对象的组织。
我读到我应该避免在游戏运行时进行分配以避免性能问题。因此,如果我在游戏状态开始时使用 reserve(1000) 初始化一个向量,并在运行时通过 push_back(Projectile()) 添加 Projectile 对象;这会导致“分配”还是它只是用东西填充已经分配的空间并且超快? ;D
【问题讨论】:
这将是超快的,因为您不要求超过 1000 个元素 使用 emplace_back 会更快,因为这样可以避免可能的复制。 @Surt push_back 支持移动语义 什么是projectile
?是可移动的吗?向量中有多少个元素? vector
毕竟提供了摊销常数push_back()
。
@AntoineMorrier,没错,但比移动更快的是根本不移动或复制,施工到位。
【参考方案1】:
将射弹放置在矢量中的不同方法具有不同的成本,具体取决于射弹的可移动性。从复制弹丸移动弹丸到在适当位置构建弹丸。
但还有一种更快的方法,即重用。
在游戏开始前建造所有的弹丸,然后一直重复使用这些弹丸。
【讨论】:
我尝试了重用方式,但它让我很头疼:因为我在每个游戏滴答声中循环遍历所有“活动”射弹,我想避免检查 if(projectile[i].active== true) 对于每个射弹,而是使第一个“索引 x”元素处于活动状态并调整 x。如果我要重用并且弹丸从活动变为非活动,我首先必须找到它在向量中的位置(循环通过所有活动元素),将其放在向量的末尾,并调整每个对象的位置具有更高的指数为-1。这真的有效吗? 如果你有 2 个变量,第一个是第一个活跃的射弹,第二个是最后一个活跃的。这将减少您必须检查的条目数量。但你的弹丸的大小和成分也决定了移动/复制它的速度。或者,如果它们很大,您有一个向量,其中只有活动射弹的入口编号。以上是关于向量 .reserve() 和分配效率 (C++)的主要内容,如果未能解决你的问题,请参考以下文章