STL中vector内存分配策略剖析

STL中vector内存分配策略剖析
相关背景知识:
size是vector当前所包含的元素个数
capacity是vector当前可以使用的容量,capacity大于等于size
reserve是设置vector的容量
实验代码如下:
#include <vector>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main(int argc,char **argv)
{
  vector<int> ivec;
  for(int i = 0;i<100;++i)
  {
    ivec.push_back(i);
    cout<<"  size="<<ivec.size()<<"  capacity="<<ivec.capacity();
    if(i % 3 == 2)
        cout<<endl;
  }
  return 0;
}

实验结果:
  size=1    capacity=1    size=2   capacity=2    size=3   capacity=4
  size=4    capacity=4    size=5   capacity=8    size=6   capacity=8
  size=7    capacity=8    size=8   capacity=8    size=9   capacity=16
  size=10   capacity=16   size=11  capacity=16   size=12  capacity=16
  size=13   capacity=16   size=14  capacity=16   size=15  capacity=16
  size=16   capacity=16   size=17  capacity=32   size=18  capacity=32
  size=19   capacity=32   size=20  capacity=32   size=21  capacity=32
  size=22   capacity=32   size=23  capacity=32   size=24  capacity=32
  size=25   capacity=32   size=26  capacity=32   size=27  capacity=32
  size=28   capacity=32   size=29  capacity=32   size=30  capacity=32
  size=31   capacity=32   size=32  capacity=32   size=33  capacity=64
  size=34   capacity=64   size=35  capacity=64   size=36  capacity=64
  size=37   capacity=64   size=38  capacity=64   size=39  capacity=64
  size=40   capacity=64   size=41  capacity=64   size=42  capacity=64
  size=43   capacity=64   size=44  capacity=64   size=45  capacity=64
  size=46   capacity=64   size=47  capacity=64   size=48  capacity=64
  size=49   capacity=64   size=50  capacity=64   size=51  capacity=64
  size=52   capacity=64   size=53  capacity=64   size=54  capacity=64
  size=55   capacity=64   size=56  capacity=64   size=57  capacity=64
  size=58   capacity=64   size=59  capacity=64   size=60  capacity=64
  size=61   capacity=64   size=62  capacity=64   size=63  capacity=64
  size=64   capacity=64   size=65  capacity=128  size=66  capacity=128
  size=67   capacity=128  size=68  capacity=128  size=69  capacity=128
  size=70   capacity=128  size=71  capacity=128  size=72  capacity=128
  size=73   capacity=128  size=74  capacity=128  size=75  capacity=128
  size=76   capacity=128  size=77  capacity=128  size=78  capacity=128
  size=79   capacity=128  size=80  capacity=128  size=81  capacity=128
  size=82   capacity=128  size=83  capacity=128  size=84  capacity=128
  size=85   capacity=128  size=86  capacity=128  size=87  capacity=128
  size=88   capacity=128  size=89  capacity=128  size=90  capacity=128
  size=91   capacity=128  size=92  capacity=128  size=93  capacity=128
  size=94   capacity=128  size=95  capacity=128  size=96  capacity=128
  size=97   capacity=128  size=98  capacity=128  size=99  capacity=128
  size=100  capacity=128
结果解析:
当vector需要分配新的内存空间的时候,分配的容量capacity是当前size的2倍,如果当前为空,则默认分配的容量capacity为1,可能有人认为容量capacity大小是2的指数倍,如上面的实验程序capacity分别为1、2、4、8、16、32、64、128,其实不然,我们再看下面的例子:
#include <vector>
#include <iostream>
using std::cin;
using std::cout;
using std::endl;
using std::vector;

int main(int argc,char **argv)
{
  vector<int> ivec;
  ivec.reserve(3);
  for(int i = 0;i<50;++i)
  {
    ivec.push_back(i);
    cout<<"  size="<<ivec.size()<<"  capacity="<<ivec.capacity();
    if(i % 3 == 2)
        cout<<endl;
  }
  return 0;
}
 实验结果:
  size=1   capacity=3   size=2   capacity=3   size=3   capacity=3
  size=4   capacity=6   size=5   capacity=6   size=6   capacity=6
  size=7   capacity=12  size=8   capacity=12  size=9   capacity=12
  size=10  capacity=12  size=11  capacity=12  size=12  capacity=12
  size=13  capacity=24  size=14  capacity=24  size=15  capacity=24
  size=16  capacity=24  size=17  capacity=24  size=18  capacity=24
  size=19  capacity=24  size=20  capacity=24  size=21  capacity=24
  size=22  capacity=24  size=23  capacity=24  size=24  capacity=24
  size=25  capacity=48  size=26  capacity=48  size=27  capacity=48
  size=28  capacity=48  size=29  capacity=48  size=30  capacity=48
  size=31  capacity=48  size=32  capacity=48  size=33  capacity=48
  size=34  capacity=48  size=35  capacity=48  size=36  capacity=48
  size=37  capacity=48  size=38  capacity=48  size=39  capacity=48
  size=40  capacity=48  size=41  capacity=48  size=42  capacity=48
  size=43  capacity=48  size=44  capacity=48  size=45  capacity=48
  size=46  capacity=48  size=47  capacity=48  size=48  capacity=48
  size=49  capacity=96  size=50  capacity=96
由上面两个例子的结果可以看出vector的内存分配策略:当vector需要分配内存的时候,分配的大小是当前size的2倍,这样在使用vector的随机访问优势的时候,内存分配的负面影响也会降到最低(不然每次要重新申请内存和复制元素,效率低下)
至此,vector的内存分配策略已呈现在各位面前,谢谢观看!
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值