vector的capacity增长规律探讨

来源:互联网 发布:如何利用网络销售水果 编辑:程序博客网 时间:2024/05/12 18:11

目录

1. 前言
2. windows
2.1 代码实现
2.2 结果
2.3 分析
3. linux
3.1 代码实现
3.2 结果
3.3 分析
4. 总结


1. 前言

STL容器的内存分配是一个重点内容,不同版本的STL的内存分配策略不尽相同,下面我从2个测试例子来说明常用的2个版本的STL中vector内存分配的规律。


2. windows环境

说明:编译器是visual studio pro 2015

2.1 代码实现

//测试capacity的增长规律void test_capacity_and_size_increase(void){    float now = clock();    struct MyStruct    {        int i;        string s;    };    vector<int> arr_0, arr_7(7);    vector<MyStruct> v;    ofstream wf_int_0("vector_int_0.txt");    ofstream wf_int_7("vector_int_7.txt");    ofstream wf_struct("vector_struct.txt");    try    {        for(int i = 0; i < 10000; ++i)        {            MyStruct ms = { i,"0" };            v.push_back(ms);            arr_0.push_back(i);            arr_7.push_back(i);            wf_int_0 << "capacity=" << arr_0.capacity() << ",size=" << arr_0.size() << endl;            wf_int_7 << "capacity=" << arr_7.capacity() << ",size=" << arr_7.size() << endl;            wf_struct << "capacity=" << v.capacity() << ",size=" << v.size() << endl;        }    }    catch(const std::exception&)    {        wf_int_0.close();        wf_int_7.close();        wf_struct.close();        exit(1);    }    wf_int_0.close();    wf_int_7.close();    wf_struct.close();    now = clock() - now;    cout << "总用时:" << now << endl;}

结果

截图1如下

这里写图片描述

截图2如下

这里写图片描述

去处重复数据后的部分截图如下

这里写图片描述

2.3 分析

从以上的截图的数据可以看出,当capacity<=1时,新分配的内存大小为1;当capacity>1时,则新增加的内存为原容量的50%(如果不为整数,则直接舍弃小数)。


3. linux环境

说明:在ubuntu 14.04LTS下,使用g++编译器

代码实现

#include <iostream>#include <vector>#include <iterator>#include <fstream>#include <ctime>#include <string>using namespace std;ofstream fout;int main(void){    float now = clock();    vector<int> arr_0, arr_7(7);    ofstream wf_int_0("vector_int_0.txt");    ofstream wf_int_7("vector_int_7.txt");    try    {        for(int i = 0; i < 10000; ++i)        {            arr_0.push_back(i);            arr_7.push_back(i);            wf_int_0 << "capacity=" << arr_0.capacity() << ",size=" << arr_0.size() << endl;            wf_int_7 << "capacity=" << arr_7.capacity() << ",size=" << arr_7.size() << endl;        }    }    catch(const std::exception&)    {        wf_int_0.close();        wf_int_7.close();        exit(1);    }    wf_int_0.close();    wf_int_7.close();    now = clock() - now;    cout << "总用时:" << now << endl;    return 0;}

结果

截图1如下

这里写图片描述

截图2如下

这里写图片描述

3.3结果分析

从以上的截图的数据可以看出,当capacity=0时,新分配的内存大小为1;当capacity>=1时,则新增加的内存为原容量的2倍。


4. 总结

不同版本的STL的内存分配策略是不一样的,其中侯捷的《STL源码剖析》一书中,讲解的就是sgi 版本的STL,sgi 版本的STL多在linux中实现,而windows的编译器实现的STL又是另一版本。这个区别需要牢牢记住。

0 0
原创粉丝点击