码迷,mamicode.com
首页 > 编程语言 > 详细

C++ STL中vector的内存机制和性能分析

时间:2016-04-18 17:22:04      阅读:369      评论:0      收藏:0      [点我收藏+]

标签:

vecotr是动态数组,顾名思义他可以动态的增加自己的长度。

内存机制:

但是怎样的增加自己的长度?

     vector有两个函数一个是capacity()返回内存空间即缓冲区的大小,另一个是size()返回当前数组中数的数量。vector增加元素来说,当容量已经不能放进数据了,那么他会重新申请一块内存,把之前的内存利用复制构造函数复制到新的内存当中,然后把新添加的内容放入后面,另外此时的他申请的内存空间是原来空间的2倍,我测得是2倍

 

     缓冲区的释放

     vecotor占用的内存只增不减,erase只是将一段区间( earse(arr.begin(), arr.end() )的值清除掉或者将某个值( erase(x) )清除掉,但是对于内存空间来说是没变化的

所有内存空间是在vector析构时候才能被系统回收。empty()用来检测容器是否为空的,clear()可以清空所有元素。但是即使clear(),vector所占用的内存空间依然如故,无法保证内存的回收。

方法一:
vecotr<Type>().swap(arr) // 回收arr内存
方法二:
模板:
Template < class T >
void ClearVector( vector< T >& vt ) 
{
    vector< T > vtTemp; 
    veTemp.swap( vt );
}
调用模板函数
void ClearVector<vector< T> & vt)
{  
    vector<int> temp;//临时对象未初始化,其缓冲区大小为0,没有数据  
    arr.swap(temp);//与我们的对象交换数据,arr的缓冲区就没了。  
}//临时变量会被析构,temp调用vector析构函数释放空间  

----------------------------------------------------------------------------

性能分析:

主要比较三种插入方式:

1、直接push_back() 2、 reserve(n) 预定n个空间,当然后续push_back()会增加,其中的值不确定, 3 resize(n, x)  申请n个空间初始化为x,

reserve只是保持一个最小的空间大小,而resize则是对缓冲区进行重新分配,里面涉及到的判断和内存处理比较多所以比reserve慢一些,对于数据数目可以确定的时候,先预设空间大小是很有必要的。直接push_back数据频繁移动很是耗时

 

C++ STL中vector的内存机制和性能分析

标签:

原文地址:http://www.cnblogs.com/zhaopAC/p/5404828.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!