STL之vector的内存
2016-06-17 20:48
531 查看
一、vector内存分配
先给个例子:
输出结果:
可以看到vector的内存空间是以2的倍数增长的,一旦空间不够了,就会将空间扩展到原来的两倍,那么这就涉及到如何扩充的问题:
假设vector目前的空间容量是1024,在放入第1025个数据时,空间不够,vector需要扩充空间,会扩充为原来的两倍,如果在vector原本的内存空间后面有1024个连续的内存空间,那么直接分配跟vector就可以了,那如果其后面不存在连续的1024个连续的空间呢,系统就会寻找一个2048个连续的内存空间,然后把原来的vector里1024个内容拷贝到这2048个空间中,可见工作量之大,所以明白vector内存的分配,就能提高效率,否则可能就是降低效率了。
vector同样可以先预支一个指定的空间:
先预支100个空间大小,当放入第101个数据时,同样会扩大两倍:
vector的内存分配是可以自定制的,比如在vs里运行开始的那段代码,输出结果就是这样的:
可以看到这里的内存并不是以两倍进行扩充的,这个貌似是跟C++11有关的。
二、vector内存释放
通过clear并不能释放vector的内存,只是把vector里的内容给清空了,真正释放内存的是swap:
输出结果:
可以看到clear后,vector的内存空间还是200,swap之后,空间大小变为0。
先给个例子:
#include<iostream> #include<vector> using namespace std; int main() { vector<int> vi; for (int i = 0; i < 10; i++) { vi.push_back(i); cout << "size: " << vi.size() << " capacity: " << vi.capacity() << endl; } return 0; }
输出结果:
可以看到vector的内存空间是以2的倍数增长的,一旦空间不够了,就会将空间扩展到原来的两倍,那么这就涉及到如何扩充的问题:
假设vector目前的空间容量是1024,在放入第1025个数据时,空间不够,vector需要扩充空间,会扩充为原来的两倍,如果在vector原本的内存空间后面有1024个连续的内存空间,那么直接分配跟vector就可以了,那如果其后面不存在连续的1024个连续的空间呢,系统就会寻找一个2048个连续的内存空间,然后把原来的vector里1024个内容拷贝到这2048个空间中,可见工作量之大,所以明白vector内存的分配,就能提高效率,否则可能就是降低效率了。
vector同样可以先预支一个指定的空间:
int main() { vector<int> vi; vi.reserve(100); for (int i = 0; i < 100; i++) { vi.push_back(i); cout << "size: " << vi.size() << " capacity: " << vi.capacity() << endl; } vi.push_back(101); cout << "size: " << vi.size() << " capacity: " << vi.capacity() << endl; return 0; }
先预支100个空间大小,当放入第101个数据时,同样会扩大两倍:
vector的内存分配是可以自定制的,比如在vs里运行开始的那段代码,输出结果就是这样的:
可以看到这里的内存并不是以两倍进行扩充的,这个貌似是跟C++11有关的。
二、vector内存释放
通过clear并不能释放vector的内存,只是把vector里的内容给清空了,真正释放内存的是swap:
#include<iostream> #include<vector> using namespace std; int main() { vector<int> vi; vi.reserve(100); for (int i = 0; i < 100; i++) { vi.push_back(i); cout << "size: " << vi.size() << " capacity: " << vi.capacity() << endl; } vi.push_back(101); cout << "size: " << vi.size() << " capacity: " << vi.capacity() << endl; vi.clear(); cout << "size: " << vi.size() << " capacity: " << vi.capacity() << endl; vector<int>().swap(vi); cout << "size: " << vi.size() << " capacity: " << vi.capacity() << endl; return 0; }
输出结果:
可以看到clear后,vector的内存空间还是200,swap之后,空间大小变为0。
相关文章推荐
- 浅析STL中的常用算法
- STL区间成员函数及区间算法总结
- c++ STL容器总结之:vertor与list的应用
- C++在成员函数中使用STL的find_if函数实例
- 关于STL中list容器的一些总结
- 关于STL中的map容器的一些总结
- 浅析stl序列容器(map和set)的仿函数排序
- STL list链表的用法详细解析
- stl容器set,map,vector之erase用法与返回值详细解析
- STl中的排序算法详细解析
- 关于STL中vector容器的一些总结
- 关于STL中set容器的一些总结
- 简单说说STL的内存管理
- STL与泛型编程(1)---模板
- CppUtest发现的STL容器内存泄漏问题
- STL中算法
- STL简单应用
- vector-list-deque
- 三十分钟掌握STL
- Qt中QSet的使用