shrink_to_fit
// string::shrink_to_fit
#include <iostream>
#include <string>
int main ()
{
std::string str (100,'x');
std::cout << "1. capacity of str: " << str.capacity() << '\n';
str.resize(10);
std::cout << "2. capacity of str: " << str.capacity() << '\n';
str.shrink_to_fit();
std::cout << "3. capacity of str: " << str.capacity() << '\n';
return 0;
}
1. capacity of str: 100
2. capacity of str: 100
3. capacity of str: 10
上述代码实现了以下功能
#include <iostream>
using namespace std;
int main()
{
vector<int>vec;
for(int i = 0 ;i < 100 ; ++i)
vec.push_back(i);
cout << vec.size() << endl; //100
cout << vec.capacity() << endl; //128
vec.erase(vec.begin()+10,vec.end()); //改变了size,但是并未改变capccity
cout << vec.size() << endl; //10
cout << vec.capacity() << endl; //128
vector<int>(vec).swap(vec);
cout << vec.size() << endl; //10
cout << vec.capacity() << endl; //10
vec.clear(); //clear并未真正释放空间!!!
cout << vec.size() << endl; //0
cout << vec.capacity() << endl; //10
vector<int> (vec).swap(vec); //这才真正释放了空间!!
cout << vec.size() << endl; //0
cout << vec.capacity() << endl; //0
return 0;
}
|
shrink_to_fit才是设计来替代swap释放内存的问题的。应该尽量用shrink_to_fit
shrink_to_fit会在几种典型情况下放弃重分配: 元素类型不支持无异常移动。使用拷贝完成内存重分配期间某个元素构造抛出异常。此时函数回滚容器到调用前状态,错误不返回。 重分配新位置需要的内存失败。 capacity()和size()相等(这种是典型情况,表示不需要重分配)。 |
放弃重分配,就是说恢复到shrink_to_fit调用以前的状态,表现的就好像这个函数根本没调用过。
构造函数表示错误状态只能通过抛异常来实现,因为构造函数没有返回值,在内层函数构造的时候一般也没有办法向通过返回值的方法向外层返回错误。至于抛不抛异常、什么时候会抛,要看元素类是怎么设计的。
回滚就是说,比如一个vector之类的容器,里面已经有10个元素,而capacity()为11,这时候调用shrink_to_fit,这个函数先分配了新的内存块刚好能容纳10个元素;接下来逐一将元素从旧的地址构造到这个新内存块的对应位置。而因为元素类不支持无异常的移动构造而使vector决定用拷贝构造的方式构造新元素。然后,比如当拷贝第4个元素的时候元素构造函数抛出异常,这时候该怎么办?vector接下来会把刚才构造成功的3个元素析构掉,然后删除新分配的那块内存后从shrink_to_fit返回。这样vector的capacity()仍旧是11而原来的10个元素都继续保持有效。这就跟没调用过shrink_to_fit一样
shrink_to_fit的更多相关文章
- c++ 将容量设置为容器的长度(shrink_to_fit)
#include <iostream> #include <vector> using namespace std; int main () { vector<); co ...
- 实战c++中的vector系列--正确释放vector的内存(clear(), swap(), shrink_to_fit())
关于vector已经写的差不多了,似乎要接近尾声了,从初始化到如何添加元素再到copy元素都有所涉及,是时候谈一谈内存的释放了. 是的,对于数据量很小的vector,完全没必要自己进行主动的释放,因为 ...
- Vector shrink 请求容器降低其容量和size匹配 shrink_to_fit();
一.先从size 和capacity 说起 resize(),设置大小(size); reserve(),设置容量(capacity); size()是分配容器的内存大小,而capacity()只是设 ...
- c++ Size capacity Resize reserve shrink_to_fit
- EasyPR--开发详解(8)文字定位
今天我们来介绍车牌定位中的一种新方法--文字定位方法(MSER),包括其主要设计思想与实现.接着我们会介绍一下EasyPR v1.5-beta版本中带来的几项改动. 一. 文字定位法 在EasyPR前 ...
- C++ std::deque
std::deque template < class T, class Alloc = allocator > class deque; Double ended queue deque ...
- c++ vector 使用
1. 包含一个头文件: 1 #include <vector> 2. 申明及初始化: std::vector<int> first; // empty vector of in ...
- C++ STL之vector用法总结
介绍 vector是表示可变大小数组的序列容器. 就像数组一样,vector也采用的连续存储空间来存储元素.也就是意味着可以采用下标对vector的元素进行访问,和数组一样高效.但是又不像数组,它的大 ...
- Ptex源码学习笔记-2
写入纹理数据: 主要分为五种写入方式:新建纹理.编辑已有纹理.编辑ExtHeader中的指定项.写入元数据和写入指定面的纹理数据.写入过程中数据存在一个临时文件中,在close时才会把临时文件的内容拷 ...
随机推荐
- gleez开发环境搭建
一.虚拟主机目录配置 1.配置apache服务器 Apache是常用的web服务器,即常见的用来处理http协议,处理网页的. Apache的配置文件都存放在/etc/apache2/目录,这里有很多 ...
- CF808D STL
D. Array Division time limit per test 2 seconds memory limit per test 256 megabytes input standard i ...
- OC @property @synthesize和id
文顶顶 OC语言@property @synthesize和id OC语言@property @synthesize和id 一.@property @synthesize关键字 注意:这两个关键字 ...
- ORACLE11G内存管理参数
今天,对ORACLE11G的几个内存参数看了一下,记录如下,大家可以参考: 1.首先,在ORACLE11G的INIT.ORA里,有“__”开头的参数,也就是以两个下划线开头的参数,这种参数应该是系统自 ...
- Laravel中不可逆的加密方法
1 //对 A 密码使用Bcrypt 加密 2 $password = Hash::make('secret'); 3 4 //你也可直接使用 bcrypt 的 function 5 $passwor ...
- C#中读写INI文件
INI文件就是扩展名为“ini”的文件.在Windows系统中,INI文件是很多,最重要的就是“System.ini”.“System32.ini”和“Win.ini”.该文件主要存放用户所做的选择以 ...
- CentOS6编译安装Python3
CentOS6默认Python版本是2, 但我使用的是Python3,因此需要自己安装 但记住,不要删除自带的Python2,否则很多东西会报错,比如yum之类的.(别问我为什么知道...) 话不多说 ...
- 在主Android Activity中加载Fragment的一般简易方法 ,来模拟一个微信界面。
在Fragment的生命周期中,需要重点关注onCreate.onCreateView.onViewCreated.Activity与Fragment生命周期在设计模式上大体一致. package c ...
- 面试题21:包含min函数的栈
题目:定义栈的数据结构,要求添加一个min函数,能够得到栈的最小元素.要求函数min.push以及pop的时间复杂度都是O(1). 分析:google的一道面试题.我看到这道题目时,第一反应就是每次p ...
- Java实现冒泡排序、折半查找
1.冒泡排序 public class BubbleSort{ public static void main(String[] args){ int score[] = {67, 69, 75, 8 ...