标准库对vector对象提供的内存分配策略

原创 2013年12月02日 22:18:30
C++ STL里,对vector采用capacity()和resize()验证标准库对vector对象提供的内存分配策略。

1 测试程序

#include <iostream>
#include <vector>

using namespace std;

int main()
{
	vector<int>  ivec;

	cout<<"ivec:size:" <<ivec.size()
	    <<"\tcapacity:"<<ivec.capacity()
	    <<"\t&ivec="   <<&ivec
    	    <<"\t&ivec[0]="<<&ivec[0]<<endl;           //这里在VS2010下报错,可以直接注析

	int ix;
	for(ix=1;ix != 11; ++ix)
	{
		ivec.push_back(ix);
		cout<<"ivec:size:" <<ivec.size()
		    <<"\tcapacity:"<<ivec.capacity()
		    <<"\t&ivec="   <<&ivec
		    <<"\t&ivec[0]="<<&ivec[0]<<endl;
	}

	while(ivec.size() != ivec.capacity())
	{
		ivec.push_back(0);
	}

	ivec.push_back(0);
	cout<<"ivec:size:" <<ivec.size()
	    <<"\tcapacity:"<<ivec.capacity()
	    <<"\t&ivec="   <<&ivec
	    <<"\t&ivec[0]="<<&ivec[0]<<endl;
    
	ivec.reserve(100);

	cout<<"ivec:size:" <<ivec.size()
	    <<"\tcapacity:"<<ivec.capacity()
	    <<"\t&ivec="   <<&ivec
	    <<"\t&ivec[0]="<<&ivec[0]<<endl;

	 while(ivec.size() != ivec.capacity())
	 {
		 ivec.push_back(0);
	 }

	 ivec.push_back(0);

	 cout<<"ivec:size:" <<ivec.size()
	     <<"\tcapacity:"<<ivec.capacity()
	     <<"\t&ivec="<<&ivec
	     <<"\t&ivec[0]="<<&ivec[0]<<endl;

	return 0;
}


2 VC6.0平台下的结果

3 VS2010平台下的结果

4 结论

(1)一般地创建空vector对象时,容量为0。
(2)当现有的容量用完后,编译器才会重新分配空间。
注意:存放在旧存储空间中元素被复制到新的存储空间,接着出入新的元素,最后撤销旧的存储空间。
(3)VC6.0平台下,新存储空间的增量为旧存储空间容量的1倍。
     VS2010平台下,新存储空间的增量为旧存储空间容量的1/2(整除2的结果,即向零取整)。

5 参考文献

[1]C++ Primer(中文版) 作者:Stanley B.Lippman 等人(著)    李师贤 等人(译)

STL中vector的内存分配与正确释放

C++ STL中的vector的内存分配与释放   1.vector的内存增长 vector其中一个特点:内存空间只会增长,不会减小,援引C++ Primer:为了支持快速的随机访问,v...
  • bzhxuexi
  • bzhxuexi
  • 2014年11月03日 16:07
  • 3086

vector内存机制和性能分析

一些好的公司校园招聘过程中(包括笔试、面试环节),经常会涉及到STL中vector的使用(主要是笔试)及其性能(面试)的分析。今天看了下相关文章,也写了几个小的测试程序跑了跑。算是总结下,希望对需要的...
  • mfcing
  • mfcing
  • 2013年04月01日 17:14
  • 20452

Java之Vector向量类实现自动动态增长的对象数组-类似动态数组

Vector 可实现自动增长的对象数组。  java.util.vector提供了向量类(vector)以实现类似动态数组的功能。在Java语言中没有指针的概念,但如果正确灵活地使用指针又确实可以大...
  • lqhed
  • lqhed
  • 2016年06月27日 20:07
  • 1211

vector内存增长方式

vector可以理解为动态数组,既然是数组,那么它在内存中就应该是一块连续的内存,但vector是如何支持动态增长的呢?...
  • qq_26849233
  • qq_26849233
  • 2017年04月25日 13:53
  • 1382

如何delete vector中new出来的内存

delete vector内存
  • gcq1992
  • gcq1992
  • 2017年04月13日 16:13
  • 643

vector内存释放机制

vector   中的内建有内存管理,当   vector   离开它的生存期的时候,它的析构函数会把   vector   中的元素销毁,并释放它们所占用的空间,所以用   vector   一般不...
  • u014774781
  • u014774781
  • 2015年09月03日 20:40
  • 2811

C++ vector变量等导致内存泄露问题的解决方法

之前在做一个音频特征提取的批量处理程序,老是出现内存泄露问题,用Visual Leak Detector(VLD)工具做了下检测,检测出了一些问题,解决后还是会有问题。之后继续排查,因为我的代码中,大...
  • cdjcong
  • cdjcong
  • 2016年03月09日 21:26
  • 3648

vector 避免内存频繁分配释放与手动释放vector内存

1.避免频繁重分配 关于STL容器,最令人称赞的特性之一就是是只要不超过它们的最大大小,它们就可以自动增长到足以容纳你放进去的数据。(要知道这个最大值,只要调用名叫max_size的成员函数。)...
  • cws1214
  • cws1214
  • 2015年08月25日 21:27
  • 4914

C++ vector 内存分配与回收机制

最近开始更加深入的学习C++,发现了很多以前没注意到但是很重要的知识点。这篇文章主要说vector内存机制和效率问题。 1. vector内存增长 vector所有的内存相关问题都可以归结于它的内存增...
  • qq_30835655
  • qq_30835655
  • 2017年03月07日 13:36
  • 1673

STL中Vector内存申请

Vector在系统中存储在一片连续内存中,支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储。设想一下,当vector添加一个元素时,为了满足连续存放这个特性,...
  • moonboat0331
  • moonboat0331
  • 2013年08月30日 17:08
  • 1098
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:标准库对vector对象提供的内存分配策略
举报原因:
原因补充:

(最多只允许输入30个字)