博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
vector的内存分配与释放
阅读量:4630 次
发布时间:2019-06-09

本文共 1752 字,大约阅读时间需要 5 分钟。

  1. vector内存分配

《Effective STL》中“条款14”:使用reserve来避免不必要的重新分配

关于STL容器,最神奇的事情之一是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。(要知道这个最大值,只要调用名叫max_size的成员函数。)对于vector和string,只要需要更多空间,就以realloc等价的思想来增长。这个类似于realloc的操作有四个部分:

  1. 分配新的内存块,它有容器目前容量的几倍。在大部分实现中,vector和string的容量每次以2为因数增长。也就是说,当容器必须扩展时,它们的容量每次翻倍。
  2. 把所有元素从容器的旧内存拷贝到它的新内存。
  3. 销毁旧内存中的对象。
  4. 回收旧内存。

给了所有的分配,回收,拷贝和析构,你就应该知道那些步骤都很昂贵。当然,你不会想要比必须的更为频繁地执行它们。如果这没有给你打击,那么也许当你想到每次这些步骤发生时,所有指向vector或string中的迭代器、指针和引用都会失效时,它会给你打击的。这意味着简单地把一个元素插入vector或string的动作也可能因为需要更新其他使用了指向vector或string中的迭代器、指针或引用的数据结构而膨胀。

 DEMO

#include 
#include
#include
using namespace std;class Person{public: Person(QString str) { m_str=str; qDebug()<< "construction:"<
m_str=p.m_str; qDebug()<< "copy construction:"<
V; //V.reserve(10); qDebug()<<"MaxSize :"<
<<"Capacity :"<
(V).swap(V); //qDebug()<<"Size :"<
<<"Capacity :"<

 

 

 

 

 

 

 

 

 

 

 

添加reserve:

V.reserve(10);

 

 

 

 

 

插入新项时就不用重新拷贝构造 b和c了,提高效率。

 

   2. vector内存释放

《Effective STL》中“条款17”:使用“交换技巧”来修整过剩容量

当vector、string大量插入数据后,即使删除了大量数据(或者全部都删除,即clear) 并没有改变容器的容量(capacity),所以仍然会占用着内存。 为了避免这种情况,我们应该想办法改变容器的容量使之尽可能小的符合当前 数据所需(shrink to fit)

《Effective STL》给出的解决方案是:

即先创建一个临时拷贝与原先的vector一致,值得注意的是,此时的拷贝 其容量是尽可能小的符合所需数据的。紧接着将该拷贝与原先的vector v进行 交换。好了此时,执行交换后,临时变量会被销毁,内存得到释放。此时的v即为原先 的临时拷贝,而交换后的临时拷贝则为容量非常大的vector(不过已经被销毁)

 

int main(int argc, char *argv[]){    QCoreApplication app(argc, argv);    {        vector
V; for(int i=0;i<1000000;i++) {V.push_back(i);} qDebug()<<"Size :"<
<<"Capacity :"<
(V).swap(V); qDebug()<<"Size :"<
<<"Capacity :"<

 

转载于:https://www.cnblogs.com/chailu/p/6179263.html

你可能感兴趣的文章
算法第二章上机实践报告
查看>>
linux--memcache的安装和使用(转)
查看>>
有关于Matlab的regionprops函数的PixelIdxList和PixelList的一点解释
查看>>
Event Loop
查看>>
new做了些什么?
查看>>
BZOJ3835[Poi2014]Supercomputer——斜率优化
查看>>
POJ-1861 Network
查看>>
Java:从字符串文本中获得数字
查看>>
Airbnb的面经复习笔记
查看>>
去面试啦 面试准备
查看>>
细说SSO单点登录
查看>>
hdu 1754
查看>>
51Nod-1276-岛屿的数量
查看>>
WebService 小实例
查看>>
工作要总分总
查看>>
最小编辑距离
查看>>
学习Sass之安装篇
查看>>
图片上传,直接在网页中显示(支持IE,谷歌,火狐浏览器)
查看>>
Kingdom Rush 国王保卫战策略心得
查看>>
Django ManyToMany
查看>>