知识点锦集(三)

五.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;
}
//输出结果:creat... copy... creat... copy... delete... copy...
#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;  //5
    cout << vec.capacity() << endl; //5
    vec.push_back(6);
    vec.push_back(7);
    vec.push_back(8);
    cout << vec.size() << endl; //8:表示vector中实际的元素数量
    cout << vec.capacity() << endl;//10:表示vetcor实际占用的内存空间
    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;   //8:表示vector中实际的元素数量
    cout << vec.capacity() << endl; //8:表示vetcor实际占用的内存空间
    vector<int>().swap(vec); //方法一
    cout << vec.size() << endl;   //0
    cout << vec.capacity() << endl; //0
    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; //9:表示vector中实际的元素数量
    cout << vec.capacity() << endl;//12:表示vetcor实际占用的内存空间
    vec.shrink_to_fit(); //size()==capacity()
    cout << vec.size() << endl;   //9
    cout << vec.capacity() << endl; //9
    vec.clear();//清空元素,size==0
    vec.shrink_to_fit();//capacity=size=0
    cout << vec.size() << endl;   //0
    cout << vec.capacity() << endl; //0
    getchar();
    return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_40087851/article/details/81539371
今日推荐