vector的内存分配与释放
1. vector内存分配
《Effective STL》中“条款14”:使用reserve来避免不必要的重新分配
关于STL容器,最神奇的事情之一是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。(要知道这个最大值,只要调用名叫max_size的成员函数。)对于vector和string,只要需要更多空间,就以realloc等价的思想来增长。这个类似于realloc的操作有四个部分:
- 分配新的内存块,它有容器目前容量的几倍。在大部分实现中,vector和string的容量每次以2为因数增长。也就是说,当容器必须扩展时,它们的容量每次翻倍。
- 把所有元素从容器的旧内存拷贝到它的新内存。
- 销毁旧内存中的对象。
- 回收旧内存。
给了所有的分配,回收,拷贝和析构,你就应该知道那些步骤都很昂贵。当然,你不会想要比必须的更为频繁地执行它们。如果这没有给你打击,那么也许当你想到每次这些步骤发生时,所有指向vector或string中的迭代器、指针和引用都会失效时,它会给你打击的。这意味着简单地把一个元素插入vector或string的动作也可能因为需要更新其他使用了指向vector或string中的迭代器、指针或引用的数据结构而膨胀。
DEMO:
#include <QtCore/QCoreApplication>
#include <QDebug>
#include <vector> using namespace std; class Person
{
public:
Person(QString str)
{
m_str=str;
qDebug()<< "construction:"<<m_str;
}
Person(const Person& p)
{
this->m_str=p.m_str;
qDebug()<< "copy construction:"<<m_str;
}
~Person()
{
qDebug()<< "destruction:"<<m_str;
}
private:
QString m_str;
}; int main(int argc, char *argv[])
{
QCoreApplication app(argc, argv);
{
vector<Person> V;
//V.reserve(10); qDebug()<<"MaxSize :"<<V.max_size()<<"Capacity :"<<V.capacity(); Person a("a");
Person b("b");
Person c("c"); qDebug()<<" push :a";
V.push_back(a);
qDebug()<<"Size :"<<V.size()<<"Capacity :"<<V.capacity();
qDebug()<<" push :b";
V.push_back(b);
qDebug()<<"Size :"<<V.size()<<"Capacity :"<<V.capacity();
qDebug()<<" push :c";
V.push_back(c);
qDebug()<<"Size :"<<V.size()<<"Capacity :"<<V.capacity(); V.clear();
qDebug()<<"Size :"<<V.size()<<"Capacity :"<<V.capacity(); //
//vector<Person>(V).swap(V);
//qDebug()<<"Size :"<<V.size()<<"Capacity :"<<V.capacity();
} return app.exec();
}

添加reserve:
V.reserve();

插入新项时就不用重新拷贝构造 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<int> V; for(int i=;i<;i++)
{V.push_back(i);}
qDebug()<<"Size :"<<V.size()<<"Capacity :"<<V.capacity(); qDebug()<<"Clear:";
V.clear();
qDebug()<<"Size :"<<V.size()<<"Capacity :"<<V.capacity(); qDebug()<<"Swap(V):";
vector<int>(V).swap(V);
qDebug()<<"Size :"<<V.size()<<"Capacity :"<<V.capacity();
}
return app.exec();
}

vector的内存分配与释放的更多相关文章
- (转)C++ STL中的vector的内存分配与释放
C++ STL中的vector的内存分配与释放http://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html 1.vector的内 ...
- C语言中的内存分配与释放
C语言中的内存分配与释放 对C语言一直都是抱着学习的态度,很多都不懂,今天突然被问道C语言的内存分配问题,说了一些自己知道的,但感觉回答的并不完善,所以才有这篇笔记,总结一下C语言中内存分配的主要内容 ...
- DLL函数中内存分配及释放的问题
DLL函数中内存分配及释放的问题 最近一直在写DLL,遇到了一些比较难缠的问题,不过目前基本都解决了.主要是一些内存分配引起问题,既有大家经常遇到的现象也有特殊的 情况,这里总结一下,做为资料. 错误 ...
- 内存管理概述、内存分配与释放、地址映射机制(mm_struct, vm_area_struct)、malloc/free 的实现
http://blog.csdn.net/pi9nc/article/details/23334659 注:本分类下文章大多整理自<深入分析linux内核源代码>一书,另有参考其他一些资料 ...
- Com组件的内存分配和释放,CredentialProvider SHStrDup 字符串拷贝问题
一.简单介绍 熟悉CredentialProvider的同学应该知道,他为一个Com组件,于是,在这里的内存分配(字符串拷贝)的一系列操作就要依照con的标准来. 二.Com组件的内存分配和释放 CO ...
- C++内存分配与释放
C++内存分配与释放 1. new 运算符 与 operator new一条 new 表达式语句( new Type; )中的 new 是指 new 运算符.operator new 是定义在 #in ...
- C++学习011-常用内存分配及释放函数
C++用有多种方法来分配及释放内存,下面是一些经常使用的内存分配及释放函数 现在我还是一个技术小白,一般用到也指示 new+delete 和 malloc和free 其他的也是在学习中看到,下面的文字 ...
- vector的内存分配机制分析
该程序初步演示了我对vector在分配内存的时候的理解.可能有误差,随着理解的改变,改代码可以被修改. /* 功能说明: vector的内存分配机制分析. 代码说明: vector所管理的内存地址是连 ...
- C/C++动态二维数组的内存分配和释放
C语言: 1 //二维数组动态数组分配和释放 //数组指针的内存分配和释放 //方法一 char (*a)[N];//指向数组的指针 a = (char (*)[N])malloc(sizeof(ch ...
随机推荐
- 【转】linux文件系统之mount流程分析
本质上,Ext3 mount的过程实际上是inode被替代的过程. 例如,/dev/sdb块设备被mount到/mnt/alan目录.命令:mount -t ext3 /dev/sdb /mnt/al ...
- mysql 编码设置
(windows下) 打开C:\Program Files\MySQL\MySQL Server 5.0\my.ini (ubuntu下) 打开 /etc/mysql/my.cnf 在[client] ...
- Exchange Server 2010升级到Exchange Server 2013概览
- html5的a标签使用
主要是href和target两个属性 示比例如以下: <a href="" target="_blank">Visit w3school</a ...
- FileSystemWatcher使用方法具体解释
FileSystemWatcher控件主要功能: 监控指定文件或文件夹的文件的创建.删除.修改.重命名等活动.能够动态地定义须要监控的文件类型及文件属性修改的类型. 1.经常使用的几个基本属性: (1 ...
- struts2必需jar包
asm-3.3.jar commons-logging-1.1.3.jarasm-commons-3.3.jar freemarker-2.3. ...
- 使用 ETag 和 Last-Modified 报头减轻服务器压力(转)
介绍你的网站在并发访问很大并且无法承受压力的情况下,你会选择如何优化?很多人首先会想从服务器缓存方面着手 对程序进行优化,许多不同的服务器缓存方式都有他们自己的特点,像我曾经参与的一些项目中,根据缓存 ...
- Web系统如何做到读取客户电脑MAC等硬件信息且兼容非IE浏览器
我们在实际Web应用中,可能会遇到“需要限定特定的电脑或用户才能使用系统”的问题. 对于一般情况来说,我们用得最多的可能是使用ActiveX控件的方法来实现,但此方案只适用于IE浏览器.为了能兼容不同 ...
- 关于UIWebview的属性的介绍
/* ViewController.h 文件 */ #import <UIKit/UIKit.h> @interface ViewController : ...
- OD调试1--第一个win32程序
OD调试一:第一个Win32程序的修改 在软件开发的过程中,程序员会使用一些调试工具,以便高效地找出软件中存在的错误.而在逆向分析领域,分析者也会利用相关的调试工具来分析软件的行为并验证分析结果.由于 ...