c/c++ 标准容器 vector的内存空间是如何自动增长的
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的内存空间是如何自动增长的的更多相关文章
- vector的内存释放
转自:http://www.cnblogs.com/summerRQ/articles/2407974.html vector : C++ STL中的顺序容器,封装数组 1. vector容器的内存自 ...
- CPP-STL:vector的内存释放
1. vector容器的内存自增长 与其他容器不同,其内存空间只会增长,不会减小.先来看看"C++ Primer"中怎么说:为了支持快速的随机访问,vector容器的元素以连续方式 ...
- 设置sde表空间为自动增长
有的用户在测试数据时,希望在SDE表空间里面不受限制地导入数据,于是需要将SDE的表空间设置为自动增长. 过程描述 1.可以在创建sde表空间的时候,添加参数Autoextend on,修改后创建命令 ...
- 关于vector的内存释放问题
以前一直想当然的以为vector 的clear()函数会保证释放vector的内存,今天网上一查资料发现完全不是我想象的那样子. 比如有如下代码: tempObject obj1; tempObjec ...
- C++ STL中vector的内存机制和性能分析
vecotr是动态数组,顾名思义他可以动态的增加自己的长度. 内存机制: 但是怎样的增加自己的长度? vector有两个函数一个是capacity()返回内存空间即缓冲区的大小,另一个是size()返 ...
- vector 释放内存 swap
相 信大家看到swap这个词都一定不会感到陌生,甚至会有这样想法:这不就是简单的元素交换嘛.的确,swap交换函数是仅次于Hello word这样老得不能老的词,然而,泛型算法东风,这个小小的玩意儿却 ...
- vector的内存分配与释放
1. vector内存分配 <Effective STL>中"条款14":使用reserve来避免不必要的重新分配 关于STL容器,最神奇的事情之一是只要不超过它们的最 ...
- c++ vector的内存释放
c++中vector的一个特点是: 内存空间只会增长,不会减小.即为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都挨着前一个元素存储.设想,如果每次vector添加一个新元素 ...
- (转)C++ STL中的vector的内存分配与释放
C++ STL中的vector的内存分配与释放http://www.cnblogs.com/biyeymyhjob/archive/2012/09/12/2674004.html 1.vector的内 ...
随机推荐
- Thrift架构介绍
Thrift是一个跨语言的服务部署框架,最初由Facebook于2007年开发,2008年进入Apache开源项目.Thrift通过一个中间语言(IDL, 接口定义语言)来定义RPC的接口和数据类型, ...
- linux http服务源码编译安装详解
相信大家大多都听过linux 的编译安装,但它到底是怎么把源代码变为自己电脑里可以应用的软件哪?今天,小编就以httpd 为例详细讲解一下. 什么是编译安装——编译:将源代码变为机器可执行的代码文件. ...
- Flask-Mail
WOW! 我的大号QQ收到了小号QQ的邮件! 小玩Flask-Mail 先到小号邮箱开启服务并获取获取授权码 https://jingyan.baidu.com/article/b0b63dbf1b ...
- 模块热替换 HMR
devserver:{hot:true},既及时更新代码,样式(需配合loader)变化,自动重编译,只适用于开发环境. 入口文件中,添加监视: + if (module.hot) {+ module ...
- [PHP]算法-堆排序的PHP实现
1.堆(二叉堆):可以视为一棵完全的二叉树,除了最底层之外,每一层都是满的,这使得堆可以利用数组来表示,每一个结点对应数组中的一个元素 2.给出某个结点的下标,可以计算出父结点的和孩子结点的下标; p ...
- Netty实战八之引导
通过前面的学习,我们可能要考虑一个问题:如何将这些部分组织起来,成为一个可实际运行的应用程序呢? 答案是引导.简单来说,引导一个应用程序是指对它进行配置,并使它运行起来的过程——尽管该过程的具体细节可 ...
- 简单易用的堡垒机系统—Teleport
简单易用的堡垒机系统-Teleport 官方文档:http://teleport.eomsoft.net/doc#!1 一.Teleport介绍 Teleport是触维软件推出的一款简单易用的堡垒机 ...
- Android udp json+数组 --->bytes发送数据
Android json支持五种数据类型 String / int(float)/bool / null / object 今天说 object : json = new JSONObject( ...
- Android 组件的三种点击事件写法
一.准备工作 1.项目结构 2.布局文件(activity_main.xml) <?xml version="1.0" encoding="utf-8"? ...
- wap2app(一)-- 网站快速打包成app
工具:HBuilder,下载地址:http://www.dcloud.io/ 下载并安装HBuilder后,打开编辑器,选择:文件 -> 新建 -> 项目,出现如下图: 选择wap2app ...