vector内存机制和性能分析
一些好的公司校园招聘过程中(包括笔试、面试环节),经常会涉及到STL中vector的使用(主要是笔试)及其性能(面试)的分析。今天看了下相关文章,也写了几个小的测试程序跑了跑。算是总结下,希望对需要的人有帮助。
关于vector,简单地讲就是一个动态数组,里面有一个指针指向一片连续的内存空间,当空间不够装下数据时会自动申请另一片更大的空间,然后把原有数据拷贝过去,接着释放原来的那片空间;当释放或者说是删除里面的数据时,其存储空间并不会释放,仅仅只是清空了里面的数据。接下来,我会详细地说说这些。
备注:本文的相关程序都是在windows 7+VS2008环境下测试。
一、首先,看看vector的内存分配机制:reserve只是保持一个最小的空间大小,而resize则是对缓冲区进行重新分配,里面涉及到的判断和内存处理比较多,当然了在这里由于最初都是空的所以差别不大。
两者的区别查看:vector::reserve和vector::resize的区别。
由此可见,对于数据数目可以确定的时候,先预设空间大小是很有必要的。直接push_back数据频繁移动很是耗时(当然了,数据小的可以忽略的)。
真个测试程序的完整代码如下
#include "stdafx.h"#include "btree.h"#include <vector>#include <iostream>#include <Windows.h>#include <fstream>#include <time.h>using std::ofstream;using std::cout;using std::endl;using std::vector;int _tmain(int argc, _TCHAR* argv[]){/************************************************************************//* vector如何强制释放内存空间*//* 默认只有析构时才会释放*//************************************************************************/vector<int> arr;cout<<"默认情况未初始化时,capacity="<<arr.capacity()<<endl;arr.resize(100,100);arr.reserve(50);arr.resize(50);cout<<"现在,capacity="<<arr.capacity()<<endl;vector<int>::iterator itor=arr.begin()+10;arr.erase(arr.begin(),itor);cout<<"capacity="<<arr.capacity()<<",size="<<arr.size()<<endl;// //方法一、 vector<int>().swap(arr); //强制释放空间//方法二、{vector<int> temp;arr.swap(temp);}//临时变量会被析构cout<<"capacity="<<arr.capacity()<<",size="<<arr.size()<<endl;clock_t start=clock();for(int num=0;num<10000;++num){vector<int> v1;for(int i=0;i<100;++i)v1.push_back(i);}cout<<"直接push循环10000次用时:"<<clock()-start<<endl;start=clock();for(int num=0;num<10000;++num){vector<int> v2;v2.resize(100);for(int i=0;i<100;++i)v2.push_back(i);}cout<<"先resize预设大小再push循环10000次用时:"<<clock()-start<<endl;start=clock();for(int num=0;num<10000;++num){vector<int> v3;v3.reserve(100);for(int i=0;i<100;++i)v3.push_back(i);}cout<<"先reserve预设大小再push循环10000次用时:"<<clock()-start<<endl;vector<int> v4;ofstream wf("2.txt");int nFlag=v4.capacity();for(int i=0;i<100;++i){v4.push_back(i);if(nFlag!=v4.capacity()){nFlag=v4.capacity();cout<<"new buffer size="<<nFlag<<endl;wf<<"capacity="<<nFlag<<endl;}}wf.close();cout<<"max_size="<<arr.max_size()<<endl;return 0;}
参考了一些前辈的文章,能力有限,欢迎指教,相互学习。