STL之vector分配内存问题
2017-04-25 20:00
190 查看
vector是STL(标准模板库)中的容器,也是最常用的。一些算法都是基于vector容器。
vector是STL容器类中最简单的一个,这里主要介绍vector的内存分配。
vector容量增长是按照现在容量的一倍进行增加的,也就是,比如当前vector的size为6,容量也为6,那么再次向vector中放入数据时,vector重新申请内存空间,这个时候vector的容量为12,而不是我们以为的容量是7。如果没有超过现有vector的容量,容量不会继续增加。
vector的内存分配:
vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后面继续增加。后面的内存有可能分配个其他的变量或程序数据等。vector容器增长的策略是,重新申请一块更大的内存,并把现有容器中的元素逐个复制过去,然后释放旧有的内存空间。如果原先有个迭代器指向vector内部,重新申请内存后,该迭代器就失效了,不能继续使用。
为什么采用这样的策略?因为每次申请内存是需要时间的,如果每次只申请一个单位的内存,则每加入一个元素,都要进行内存的申请,并且要将原来的数据复制到新的内存空间。按照一倍的策略,则会避免这个问题,减少了申请内存的次数,降低了时间开销。
下面是一些实验:
实验结果:
![](https://img-blog.csdn.net/20170425195353650?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
从实验结果可以看出刚开始容量大小为0,增加一个元素后,容量变成1,再次增加一个元素时,容量变成2,再增加一个元素时,容量这个时候就变成了4。说明是成倍增加的。
下面是内存的查看:
实验结果:
![](https://img-blog.csdn.net/20170425195857934?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
每次引用a[0]的地址,可以看到两次打印的结果是不同的,说明vector重新申请了一块更大的新的内存,并且将原来里面的值复制到新的内存空间。
这里讨论下要不要使用STL的问题,对于初学者,自己还是要实现一遍这些容器,不必全部实现,基本的需要实现,这样加深自己的理解,不仅要知其然,还要知其所以然。起码知道自己用的是什么,比如从网上下载了一个不知名的软件,怎么知道不会有后门呢,最好找到源码,自己编译,然后使用。这样才放心。
像STL中的队列,栈,链表等,实现的已经很完美了,当学会这些原理,并且能够自己实现的时候,就可以使用这些容器了,不必每次都自己实现,毕竟重复的工作最没意思。
vector是STL容器类中最简单的一个,这里主要介绍vector的内存分配。
vector容量增长是按照现在容量的一倍进行增加的,也就是,比如当前vector的size为6,容量也为6,那么再次向vector中放入数据时,vector重新申请内存空间,这个时候vector的容量为12,而不是我们以为的容量是7。如果没有超过现有vector的容量,容量不会继续增加。
vector的内存分配:
vector容器分配的是一块连续的内存空间,每次容器的增长,并不是在原有连续的内存空间后面继续增加。后面的内存有可能分配个其他的变量或程序数据等。vector容器增长的策略是,重新申请一块更大的内存,并把现有容器中的元素逐个复制过去,然后释放旧有的内存空间。如果原先有个迭代器指向vector内部,重新申请内存后,该迭代器就失效了,不能继续使用。
为什么采用这样的策略?因为每次申请内存是需要时间的,如果每次只申请一个单位的内存,则每加入一个元素,都要进行内存的申请,并且要将原来的数据复制到新的内存空间。按照一倍的策略,则会避免这个问题,减少了申请内存的次数,降低了时间开销。
下面是一些实验:
#include <iostream> #include <vector> #include <cstdlib> using namespace std; int main() { vector<int>a; cout << "初始化的容量大小 = " << a.capacity()<<endl; a.push_back(1); cout << "元素数目 = " << a.size() << endl; cout << "增加一个元素后容量的大小 = " << a.capacity() << endl; a.push_back(1); cout << "元素数目 = " << a.size() << endl; cout << "增加一个元素后容量的大小 = " << a.capacity() << endl; a.push_back(1); cout << "元素数目 = " << a.size() << endl; cout << "增加一个元素后容量的大小 = " << a.capacity() << endl; return 0; }
实验结果:
从实验结果可以看出刚开始容量大小为0,增加一个元素后,容量变成1,再次增加一个元素时,容量变成2,再增加一个元素时,容量这个时候就变成了4。说明是成倍增加的。
下面是内存的查看:
#include <iostream> #include <vector> #include <cstdlib> using namespace std; int main() { vector<int>a; a.push_back(1); cout << "增加一个元素的内存地址 = " << &a[0] << endl; a.push_back(2); cout << "增加一个元素的内存地址 = " << &a[0] << endl; return 0; }
实验结果:
每次引用a[0]的地址,可以看到两次打印的结果是不同的,说明vector重新申请了一块更大的新的内存,并且将原来里面的值复制到新的内存空间。
这里讨论下要不要使用STL的问题,对于初学者,自己还是要实现一遍这些容器,不必全部实现,基本的需要实现,这样加深自己的理解,不仅要知其然,还要知其所以然。起码知道自己用的是什么,比如从网上下载了一个不知名的软件,怎么知道不会有后门呢,最好找到源码,自己编译,然后使用。这样才放心。
像STL中的队列,栈,链表等,实现的已经很完美了,当学会这些原理,并且能够自己实现的时候,就可以使用这些容器了,不必每次都自己实现,毕竟重复的工作最没意思。
相关文章推荐
- vector 容器使用时应该注意的内存分配问题
- (转)C++ STL中的vector的内存分配与释放
- STL中Vector的内存分配机制
- STL---vector的内存分配策略
- C++ STL中的vector的内存分配与释放
- STL----vector的内存分配与释放
- C++ STL中的vector的内存分配与释放
- C++ STL中的vector的内存分配与释放
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- [置顶] 从零开始学C++之STL(二):实现简单容器模板类Vec(vector capacity 增长问题、allocator 内存分配器)
- STL中vector的内存分配与释放
- C++ STL中的vector的内存分配与释放
- vector 容器使用时应该注意的内存分配问题
- STL容器vector的内存问题
- STL中vector的内存分配与正确释放
- C++的STL中vector内存分配方法的简单探索
- C++ STL中的vector的内存分配与释放
- C++ std::vector元素的内存分配问题(补充)
- vector的内存分配问题
- STL中vector的内存分配机制