繁体   English   中英

C ++向量内存使用 - 是否曾被释放?

[英]C++ Vector Memory Usage - Is it ever freed?

我知道,只要超过capacity() ,向量就会加倍。 这个操作需要一些时间,这就是为什么向量应该通过push_back()添加元素的分摊的常量时间。

  1. 我想知道的是......当向量缩小以使其size()小于capacity()一半时会发生什么。

  2. 载体是否放弃了它们使用的记忆,或者直到载体被破坏为止?

如果它们的尺寸不缩小,可能会浪费很多内存,但我从未听说过它们具有这种功能。

不,它永远不会被释放(即容量永远不会减少)直到毁灭。 释放一些内存的常用习惯是创建一个正确大小的新向量,并使用它来代替:

std::vector<type>(originalVector).swap(originalVector);

(受“更多例外C ++”启发,第7项)

如果你想确保你的矢量使用尽可能少的空间,你可以说:

std::vector<Foo>(my_vector).swap(my_vector);

您也可以调用shrink_to_fit()成员函数,但这只是一个非绑定请求。

从向量中擦除元素或甚至完全清除向量不一定释放与该元素相关联的任何存储器。 这是因为自创建以来向量的最大大小是对向量未来大小的良好估计。

要使用缩小以适应成语

std::vector<int> v;
//v is swapped with its temporary copy, which is capacity optimal
std::vector<int>(v).swap(v);

C ++ 0x中的解决方案

在C ++ 0x中,一些容器将这样的习惯用法称为函数shrink_to_fit(),例如vector,deque,basic_string。 shrink_to_fit()是一个将capacity()减小为size()的非绑定请求。

它们的尺寸不会缩小。

解除分配内存通常不会有用。

例如,矢量现在可以缩小,但之后会再次增长。 释放额外的内存(并复制内存中的所有元素)只是为了以后重新分配它将是一种浪费。

如果一个向量正在收缩,那么向量很可能会缩小为空,然后被破坏。 在这种情况下,因为收缩而解除分配也会浪费时间。

它也可以是重用矢量对象的有用优化,以避免分配/处理内容。 这会因为收缩而引入解除分配而毁掉。

基本上,大多数时候释放额外的内存是不值得的。 在少数情况下,您可以特别要求进行交易。

记忆消失,直到矢量被破坏。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM