五.vector内存分配与释放
- vector的内存分配
- vector容器的内存空间只增不减。C++ Primer中提及:为了支持快速的随机访问,vector容器的元素以连续方式存放,每一个元素都紧挨着前一个元素存储(数组)。
- 当存储空间达到上限时,vector容器会申请新的空间(新空间=2*旧空间),拷贝元素,撤销旧空间(vector的迭代器会失效)。因此,vector进行内存分配时,实际分配的容量要比当前所需的空间多一些,这样就不必为每一个新元素(push_back操作)重新分配整个容器的内存空间。
- vector中两个函数:size()函数表示vector中实际的元素数量;capacity()函数表示vetcor实际占用的内存空间。每当vector容器分配新的存储空间时,会以“倍数”分配策略实现重新分配。
#include<iostream>
#include<vector>
using namespace std;
class A {
public:
A() {
cout << "creat..." << endl;
}
A(const A& it) {
cout << "copy..." << endl;
}
~A(){
cout << "delete..." << endl;
}
};
int main(int argc, char* argv[]) {
vector<A> result;
A a1;
result.push_back(a1);
A a2;
result.push_back(a2);
getchar();
return 0;
}
#include<iostream>
#include<vector>
using namespace std;
int main(int argc, char* argv[]) {
vector<int> vec{ 1,2,3,4,5 };
cout << vec.size() << endl;
cout << vec.capacity() << endl;
vec.push_back(6);
vec.push_back(7);
vec.push_back(8);
cout << vec.size() << endl;
cout << vec.capacity() << endl;
getchar();
return 0;
}
- vector内存释放
- 上面提到vector内存占用空间只增不减,当我们删除元素时,元素数量(size)会发生改变,但所占用的内存空间(capacity)并不会减少。vector容器所占用的内存空间在vector析构时才被系统回收。
- vector中的两个函数:empty()用来检测容器中是否有元素,clear()用来清空所有元素。但正如上面提到的,即使clear(),vector所占用的内存空间依然如故,无法保证内存的回收。
- 当vector容器中数据量较小时,没有必要对vector占用的内存空间进行释放,对程序的性能和效率几乎没有影响。但当数据量较大时,对vector所占用的内存空间进行释放是非常有必要的。
- 方法一:临时对象+swap()释放内存。swap()是交换函数,使vector离开其自身的作用域,从而强制释放vector所占的内存空间。
- 方法二:clear()+shrink_to_fit()释放内存(C++11)。shrink_to_fit()函数是将容器占用的内存空间减少到现在需要的内存大小,即size()==capacity()。先进行clear操作清空元素,使size=0,再进行shrink_to_fit(),使capacity=size=0。
#include<iostream>
#include<vector>
using namespace std;
int main(int argc, char* argv[]) {
vector<int> vec{ 1,2,3,4,5,6,7,8 };
cout << vec.size() << endl;
cout << vec.capacity() << endl;
vector<int>().swap(vec);
cout << vec.size() << endl;
cout << vec.capacity() << endl;
getchar();
return 0;
}
#include<iostream>
#include<vector>
using namespace std;
int main(int argc, char* argv[]) {
vector<int> vec{ 1,2,3,4,5,6,7,8 };
vec.push_back(9);
cout << vec.size() << endl;
cout << vec.capacity() << endl;
vec.shrink_to_fit();
cout << vec.size() << endl;
cout << vec.capacity() << endl;
vec.clear();
vec.shrink_to_fit();
cout << vec.size() << endl;
cout << vec.capacity() << endl;
getchar();
return 0;
}