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的内 ...
随机推荐
- CoreJava(一)—— Java迭代语句
本文介绍一些关于迭代语句的一些相关技巧以及Java8中的迭代语句的使用方法. public class TestBreak { public static void main(String[] arg ...
- js_html_input中autocomplete="off"在chrom中失效的解决办法
分享网上的2种办法: 1-可以在不需要默认填写的input框中设置 autocomplete="new-password"(已实测,有效) 网上咱没有找到对其详细解释,但是发现16 ...
- 第一册:lesson 11.
原文:Is this your shirt? A:Whose shirt is that? Is this your shirt B? B:NO,sir. It's not my shirt.This ...
- JSTL_Format标记库
JSTL_Format 一:JSTL Format标记库 如有转载,请标明出处 介绍标记属性的时候,按照顺序必须写的->带有默认值的->其他的,中间用回车隔开 在jsp问价开头加上 < ...
- python文件
目录 1. 文件的概念 1.1 文件的概念和作用 1.2 文件的存储方式 2. 文件的基本操作 2.1 操作文件的套路 2.2 操作文件的函数/方法 2.3 read 方法 -- 读取文件 2.4 打 ...
- Golang 正则表达式Regex相关资料整理
Golang 支持的正在表达式是 https://github.com/google/re2/wiki/Syntax 注意这里提示 NOT SUPPORTED的。 工具 一些测试正则表达式的工具 推荐 ...
- JS经典题目解析
此次列举出一些觉得有意思的JS题目(来源于出了名的44题),相信有非常多关于这些题目的博客,写这篇博客的目的在于巩固一些知识点,希望能和读者共同进步. 1. map函数执行过程 ["1&qu ...
- crontab清理日志
1.日志介绍 2.日志清理 (以下达到清理效果) du -sh * //查看日志大小 * 1 * * * cat /dev/null > /var/log/message 解释/dev/nul ...
- @Value取不到值的原因(引用application.properties中自定义的值)
在spring mvc架构中,如果希望在程序中直接使用properties中定义的配置值,通常使用一下方式来获取: @Value("${tag}") private String ...
- SAP MM PO 中的Delivery Date并非保存在EKPO表里
采购订单行项目中的deliverydate并非如同其它字段值一样是保存在采购订单行项目表EKPO里的, 而是从EKET表里抓取最早的Delivery Date作为该Item的delivery date ...