【面试实战】vector内存机制和性能分析


来源: https://blog.csdn.net/mfcing/article/details/8746256

简述

关于vector,简单地讲就是一个动态数组,里面有一个指针指向一片连续的内存空间,当空间不够装下数据时会自动申请另一片更大的空间,然后把原有数据拷贝过去,接着释放原来的那片空间;当释放或者说是删除里面的数据时,其存储空间并不会释放,仅仅只是清空了里面的数据

vector的内存分配机制

capacity()返回的是当前vector对象缓冲区(后面的对vector维护的内存空间皆称为缓冲区)实际申请的空间大小,
size()返回的是当前对象缓冲区中存储数据的个数,
capacity永远是大于等于size的,当size和capacity相等时继续添加数据时vector会扩容。
扩容:每次扩容都是增加当前空间的50%(第一次除外);

vector实现

如何强制释放vector的缓冲区

  1. vector<int>().swap(arr); //强制释放空间
  2. vector<int> temp;
    arr.swap(temp);//临时变量会被析构

如何使用提高性能

使用的三种方式:

  1. 直接每次push_back()
  2. 使用resize()提前分配空间(这样就不用了扩容了)
  3. 使用reserve提前分配空间

MSDN中,这两个个函数的说明分别是:

  1. reserve : Reserves a minimum length of storage for a vector object, allocating space if necessary.
  2. resize :Specifies a new size for a vector.

reserve和resize区别
在这里我们初始化的时候使用感觉好像是差不多。

测试用例

#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[i] = 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;
}

运行结果
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值