c++矢量内存使用-它是否曾经被释放
C++ Vector Memory Usage - Is it ever freed?
我知道每当它们的capacity()
超过时,向量的大小就会翻倍。这个操作需要一些时间,这就是为什么向量应该有平摊常数时间来使用push_back()
添加元素。
-
我想知道的是…
当一个矢量缩小到它的 向量是否会放弃它们使用的内存,或者它只是在向量被销毁之前就消失了?
size()
小于capacity()
的一半时会发生什么?如果它们不缩小大小,可能会浪费很多内存,但我从来没有听说过它们有这个功能。
不,它永远不会被释放(即容量永远不会减少),直到销毁。释放内存的一种常用方法是创建一个大小正确的新向量,并使用它:
std::vector<type>(originalVector).swap(originalVector);
(灵感来自"More Exceptional c++ ", Item #7)
如果你想确保你的向量使用尽可能少的空间,你可以说:
std::vector<Foo>(my_vector).swap(my_vector);
您也可以调用shrink_to_fit()
成员函数,但这只是一个非绑定请求。
从vector中删除元素甚至完全清除vector并不一定会释放与该元素相关的任何内存。这是因为vector自创建以来的最大大小可以很好地估计该vector未来的大小。
使用收缩以适应习惯用法:
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()的非绑定请求。
它们的大小不会缩小。
取消内存分配通常是没有用的。
例如,vector现在可以收缩,但稍后会再次增长。重新分配额外的内存(并复制内存中的所有元素)只是为了以后重新分配它,这将是一种浪费。
如果一个vector正在收缩,那么该vector也很有可能被收缩为空,然后销毁。在这种情况下,随着内存收缩而释放内存也是浪费时间。
它也可以是一个有用的优化重用vector对象,以避免分配/释放内容。当它收缩时,引入释放会破坏这一点。
基本上,大多数时候释放额外的内存是不值得的。在少数情况下,您可以明确地请求释放。
内存耗尽,直到vector被销毁。
- 在提升multi_index容器中,是否定义了"default index"?
- 在C++STL中是否有Polyval(Matlab函数)等价物?
- 检查输入是否不是整数或数字
- 是否可以初始化不可复制类型的成员变量(或基类)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 此代码是否违反一个定义规则
- 是否需要删除包含对象的"pair"?
- 是否可以从int转换为enum类类型
- 无论条件是否为true,if总是在c++中执行
- 如何找到大小'x'数组是否完全填充,在C++?
- 检查值是否在集合p1和p2中,但不在p3中
- 是否可以在编译时初始化数组,以便在运行时不会花费时间?
- 检查 std::shared_ptr<> 的当前底层类型是否为 T
- 在c++中检查长方体是否尽可能快地重叠(无迭代)
- GL_SHADERSTORAGE_BUFFER位置是否与其他着色器位置冲突
- c++ 中的抽象方法是否曾经调用过?
- qsort C++是否曾经将元素与自身进行比较?
- std::initializer_list 是否有复制构造函数,是否曾经使用过?
- c++矢量内存使用-它是否曾经被释放