释放分配给大量矢量的内存的最有效方法是什么?
What is the most efficient way of freeing the memory allocated to a massive vector?
我有一个庞大的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);
}
// ...
- 在C++中初始化向量映射的最有效方法
- 将此布尔值传递给此函数的最有效方法是什么?
- 比较C++变量的最有效方法
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 存储变量的更有效方法是什么?
- 确保套装新鲜度的有效方法
- 当映射包含字符串向量作为值时,从值中获取键的有效方法
- 映射唯一值和重复值的有效方法.可以访问键或值的位置
- 在C++事务之间存储大量字符数据的有效方法
- 在unordered_multimap中精确迭代一次每个键的有效方法
- 一种将 Dart 中的字节数据转换为 C++ 中的无符号字符*的有效方法?
- 检查两个向量是否并行的最有效方法
- 从浮点数中删除小数部分但保留类型的有效方法
- 传递非泛型函数的最有效方法是什么?
- 按升序打印矢量的所有元素直到它为空而没有重复项的最有效方法是什么?
- 创建字符串数组的有效方法
- 返回一个引用C++中另一个类对象的对象的有效方法
- C++去除前x个元素的有效方法,在不改变向量大小的情况下将第x+1个元素推到第一个
- 将一种数据类型的向量复制到同一数据类型的结构向量中的有效方法是什么
- 从std::map值中获取密钥的有效方法