释放分配给大量矢量的内存的最有效方法是什么?



我有一个庞大的std::vector<strc> V,里面装满了100M多个元素,我将其用作某些函数foo的输入。在这里,strc只是一个包含三个基元的struct。调用foo结束后,我对V没有任何意义,所以我想从中回收尽可能多的内存。显然,V.clear()不能完成这项工作,因为V保留了它的能力。

我读过一些提倡技巧std::vector<strc>().swap(V)的建议,但它看起来相当花哨,不是一种好的做法。我什至不确定它是否满足了我的需要!有没有标准的方法可以做到这一点?如果swap确实是最好的选择,我应该先打电话给clear吗?由于swap的复杂性是恒定的,因此似乎swap实际上是在将V的地址与空的无名称向量的地址交换。那么,最初在V中的所有东西会发生什么?我希望它保留在内存中,但不再可访问。交换后,该内存块是否直接标记为可用?即,以某种方式解除分配?

其他消息来源建议V.clear()然后V.shrink_to_fit().这是更好的选择吗?

从技术上讲,确保没有剩余分配的唯一保证方法是销毁向量(而不是用新的向量替换(。

但在实践中,使用默认构造的交换和清除 + 收缩都将起作用。

<小时 />
std::vector<strc>().swap(V)

那么,最初在 V 中的所有东西会发生什么?

它被交换到临时表达式中,临时表达式在完整表达式结束时被销毁,从而破坏元素并释放分配。

相当理论化的问题是,默认构造一个向量 - 将被交换成V- 在技术上不能保证不分配大量数组。实际上它不会,所以这很好。

如果交换确实是最好的选择,我应该先打电话给清楚吗?

这不是必需的。元素的销毁由矢量的析构函数处理。

其他来源建议V.clear((和V.shrink_to_fit((。这是更好的选择吗?

意图当然更清楚。

但是,从技术上讲,shrink_to_fit不能保证实际缩小容量 - 这是实现没有义务遵循的请求 - 因此这并不能比交换解决方案更保证释放内存。在实践中,我认为任何实现都没有理由不释放空向量的任何分配,因此这在实践中也应该没问题。

把它放在一个范围内:

{
std::vector<strc> V;
// ...
foo(V);
}
// ...

最新更新