c/c++ 标准容器 vector的内存空间是如何自动增长的

vector,string,deque的内存存储机制:在一个连续的内存空间存储,所以才支持下标操作。

vector的课题:由于容器的大小是可变的,当插入元素后,vector必须分配新的内存来保存已有元素和新的元素,将已有元素从旧的内存地址移动到新的内存地址,并释放掉旧的内存空间。如果我们每添加一个新元素,vector就执行一次这样的内存分配和释放操作,性能会慢到不可接受

解决方案:为了避免这种代价,标准库实现者采用了可以减少容器空间重新分配次数的策略。当不得不获取新的内存空间时,vector和string的实现通常会分配比新的要求空间更大的内存空间。容器预留这些空间备用,可用来保存更多的元素。这样,就不需要每次添加新元素都重新分配容器的内存空间了。

有了上述的背景,就有了下面的函数:

capacity 返回size + 预留空间的大小
reserve(n) 分配至少能容纳n个元素的空间
shrink_to_fit 将capacity()减少为为与size()相同大小
#include <iostream>
#include <vector>
#include <string>
#include <list>
#include <forward_list>
#include <deque> using namespace std; int main(){
//下面代码展示了size和capacity之间的相互作用
vector<int> ivec;
//size为0;capacity的值依赖于库的具体实现
cout << " ivec:size: " << ivec.size()
<< " capaciy: " << ivec.capacity() << endl;
//想ivec添加24个元素
for(vector<int>::size_type i = 0; i != 24; ++i){
ivec.push_back(i);
}
//size为24;capacity大于等于24
cout << " ivec:size: " << ivec.size()
<< " capaciy: " << ivec.capacity() << endl;
//用reserve预分配一些额外的空间
ivec.reserve(50);
//size还是24;capacity大于等于50
cout << " ivec:size: " << ivec.size()
<< " capaciy: " << ivec.capacity() << endl;
//添加元素,用光多余容量
while(ivec.size() != ivec.capacity()){
ivec.push_back(0);
}
//size为50;capacity为50
cout << " ivec:size: " << ivec.size()
<< " capaciy: " << ivec.capacity() << endl;
//再添加一个元素,vector就不得不重新分配空间
ivec.push_back(51);
//size为51;capacity的值依赖于库的具体实现
cout << " ivec:size: " << ivec.size()
<< " capaciy: " << ivec.capacity() << endl;
//要求归还内存
//shrink_to_fit只是一个请求,标准库并不保证退还内存
ivec.shrink_to_fit();
//size为51;capacity的值依赖于库的具体实现
cout << " ivec:size: " << ivec.size()
<< " capaciy: " << ivec.capacity() << endl;
}

c/c++ 学习互助QQ群:877684253

本人微信:xiaoshitou5854

c/c++ 标准容器 vector的内存空间是如何自动增长的的更多相关文章

  1. vector的内存释放

    转自:http://www.cnblogs.com/summerRQ/articles/2407974.html vector : C++ STL中的顺序容器,封装数组 1. vector容器的内存自 ...

  2. CPP-STL:vector的内存释放

    1. vector容器的内存自增长 与其他容器不同,其内存空间只会增长,不会减小.先来看看"C++ Primer"中怎么说:为了支持快速的随机访问,vector容器的元素以连续方式 ...

  3. 设置sde表空间为自动增长

    有的用户在测试数据时,希望在SDE表空间里面不受限制地导入数据,于是需要将SDE的表空间设置为自动增长. 过程描述 1.可以在创建sde表空间的时候,添加参数Autoextend on,修改后创建命令 ...

  4. 关于vector的内存释放问题

    以前一直想当然的以为vector 的clear()函数会保证释放vector的内存,今天网上一查资料发现完全不是我想象的那样子. 比如有如下代码: tempObject obj1; tempObjec ...

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

    vecotr是动态数组,顾名思义他可以动态的增加自己的长度. 内存机制: 但是怎样的增加自己的长度? vector有两个函数一个是capacity()返回内存空间即缓冲区的大小,另一个是size()返 ...

  6. vector 释放内存 swap

    相 信大家看到swap这个词都一定不会感到陌生,甚至会有这样想法:这不就是简单的元素交换嘛.的确,swap交换函数是仅次于Hello word这样老得不能老的词,然而,泛型算法东风,这个小小的玩意儿却 ...

  7. vector的内存分配与释放

    1. vector内存分配 <Effective STL>中"条款14":使用reserve来避免不必要的重新分配 关于STL容器,最神奇的事情之一是只要不超过它们的最 ...

  8. c++ vector的内存释放

    c++中vector的一个特点是: 内存空间只会增长,不会减小.即为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都挨着前一个元素存储.设想,如果每次vector添加一个新元素 ...

  9. (转)C++ STL中的vector的内存分配与释放

    C++ STL中的vector的内存分配与释放http://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html 1.vector的内 ...

随机推荐

  1. Oracle数据库over函数的使用

    转自:  https://blog.csdn.net/a1065423444/article/details/75635611 over()函数写法over(partition by expr2 or ...

  2. 项目详解2—LVS负载均衡详解

    一.负载均衡集群介绍 1.集群 ① 集群(cluster)技术是一种较新的技术,通过集群技术,可以在付出较低成本的情况下获得在性能.可靠性.灵活性方面的相对较高的收益,其任务调度则是集群系统中的核心技 ...

  3. Perl导入代码文件

    从函数复用开始:eval和do执行perl文件 当我们定义了一个功能比较通用的子程序,比如获取数值的绝对值.想要到处使用这个子程序,就得不断复制.粘贴这段绝对值函数的定义文本.显然,这是不太理想的方式 ...

  4. shell编程基础(二): shell脚本语法之分支语句和循环语句

    一.分支语句 1.条件测试:test [ 命令test或[可以测试一个条件是否成立,如果测试结果为真,则该命令的Exit Status为0,如果测试结果为假,则命令的Exit Status为1(注意与 ...

  5. zepto 事件分析2($.on)

    这里主要分析zepto事件中的$.on函数,先看一下该函数的代码 $.fn.on = function(event, selector, data, callback, one){ var autoR ...

  6. Winform下KeyDown,KeyPress,KeyUp事件的总结(转)

    原文: http://www.cnblogs.com/xiashengwang/archive/2011/09/15/2578798.html 在winform程序中,经常会用到这几个事件用于控制数字 ...

  7. C#基础知识总结(六)

    摘要 方法的总结:其中包含方法的解释.方法参数.方法返回值,方法重载,out.ref.in的用法一.C#面向过程方面的总结 顺序结构:程序按照程序代码的顺序执行 分支结构:if-else.switch ...

  8. 最全的.NET Core跨平台微服务学习资源没有之一

    一.Asp.net Core基础 微软英文官网:https://docs.microsoft.com/en-us/aspnet/core/?view=aspnetcore-2.1 .NET Core: ...

  9. Github被微软收购,这里整理了16个替代品

    微软斥资75亿美元收购以后,鉴于微软和开源竞争的历史,很多开发者都感到惊恐.毕竟,互联网上最大的一块可以自由的净土被微软染指,宝宝不开森.如果你真的担心微软会对Github有所动作,那么这里我列举了1 ...

  10. gulp插件构建项目 压缩js、css、image、zip、web服务、跨域等插件

    推荐一个很好文: https://github.com/lin-xin/blog/issues/2 匹配符 *.**.!.{} gulp.src('./js/*.js') // * 匹配js文件夹下所 ...