gpt4 book ai didi

c++ - 适当的 vector 内存管理

转载 作者:可可西里 更新时间:2023-11-01 17:01:14 25 4
gpt4 key购买 nike

我正在制作一款游戏,我有一个子弹飞来飞去的 vector 。子弹完成后,我执行 bullets.erase(bullets.begin() + i);然后子弹消失了。然而,它似乎并没有获得内存棒。如果我创建 5000 颗子弹,然后在这些子弹消失后再创建 5,000 颗,内存保持不变,但如果我在这 5000 颗子弹飞行时再创建 5,000 颗,它将分配新的空间。我需要做什么才能真正释放这些内存?

最佳答案

std::vector 类自动管理其内部存储器。它会扩展以容纳您放入其中的所有项目,但通常它不会在您移除项目时自行收缩(尽管它当然会在破坏时释放内存)。

std::vector 有两个与“大小”相关的概念。首先是“保留”大小,即它从系统分配了多少内存用于存储 vector 元素。第二个是“已用”大小,即 vector 中逻辑上有多少元素。显然,保留大小必须至少与使用大小一样大。您可以使用 size() 方法(我相信您已经知道)发现已用大小,并且可以使用 capacity() 方法发现保留大小.

通常,当使用和保留大小相同时,如果您尝试插入一个新元素, vector 将分配一个新的内部缓冲区,其大小是先前保留大小的两倍,并将所有现有元素复制到该缓冲区中。这对您来说是透明的,只是它会使您持有的任何迭代器失效。正如我之前提到的,AFAIK,大多数 STL 实现永远不会缩小保留大小作为对删除的响应。

不幸的是,虽然您可以使用 reserve() 方法强制 vector 增加其保留大小,但这不适用于减少预留容量。据我所知,减少容量的最佳做法是执行以下操作:

std::vector<Bullet>(myVector).swap(myVector);

这将做的是创建一个临时 vector ,它是原始 vector 的拷贝(但具有最小必要容量),然后交换两个 vector 的内部缓冲区。这将导致您的原始 vector 具有相同的数据,但保留的大小可能更小。

现在,因为创建临时拷贝是一项相对昂贵的操作(即它比正常的读取/插入/删除花费更多的处理器时间),所以您不想每次删除元素时都这样做。出于同样的原因,这就是当您需要超过现有大小时, vector 将其保留大小加倍而不是将其增加 1 的原因。因此,我建议您在删除相对较多的元素后,并且知道您不会很快添加那么多元素后,执行上面的交换“技巧”以减少容量。

最后,您可能还想考虑为此使用 std::vector 以外的东西。与许多其他类型的数据结构相比,从 vector 中间删除元素(您似乎经常这样做)是一个缓慢的操作(因为 vector 必须将所有后续元素复制回一个槽以填充孔) .哪种数据结构最适合您的目的取决于您对数据执行的其他操作。

关于c++ - 适当的 vector 内存管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2253969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com