vector的内存分配 新理解

vector的内存分配:之前看一些书和博客都是说capacity当vector没有内存的时候  分配之前的两倍的内存 之后把之前的赋值过去    后来实验到应该是1/2

一、首先,看看vector的内存分配机制:
int  main()
{
        vector  < A  > v;
        A  a1(1);
        int  tNowCa;
        int  num=1;
        for (  int  i=0;i<200;i++){
            v.push_back(a1);
              if (i==0){tNowCa=v.capacity();  continue  ;}
              if (tNowCa!=v.capacity()){
                  printf(  "%d\n"  ,tNowCa);
                  tNowCa=v.capacity();
            }
      }
}

1
2
3
4
6
9
13
19
28
42
63
94
141
每次扩容都是增加当前空间的50%(第一次除外);

网上的代码GCC的vector
  1. if (_Capacity < size() + _Count)//当前空间不足,需要扩容  
  2.             {   // not enough room, reallocate  
  3.             _Capacity = max_size() - _Capacity / 2 < _Capacity  
  4.                 ? 0 : _Capacity + _Capacity / 2;    // try to grow by 50%,扩容50%  
  5.             if (_Capacity < size() + _Count)//扩容50%后依然不够容下,则使容量等于当前数据个数加上新增数据个数  
二、构造函数的调用
int  Anum=64;

class   A
{
public  :
        int  a;
      A()
      {
            a=++Anum;
            printf(  "编号%c构造函数\n"  ,a);
      }

      A(  const   A  a )
      {
              this  ->a=++Anum;
            printf(  "编号%c复制构造函数\n"  , this  ->a);
      }
      ~A()
      {
            printf(  "编号%c析构函数\n"  ,a);
      }
};

int  main()
{
        vector  < A  > v;
        A  a1;
      v.push_back(a1);
      printf(  "现在v的capacity是%d   size是%d\n"  ,v.capacity(),v.size());
      v.push_back(a1);
      printf(  "现在v的capacity是%d   size是%d\n"  ,v.capacity(),v.size());
}



分析一下:
代码:A  a1;
调用构造函数输出:
编号A构造函数
代码: v.push_back(a1);
v开始的capacity和size都为0  现在push之后空间不够  去开空间1大小
调用赋值构造函数  所以输出:
编号B复制构造函数
push之后:输出:
现在v的capacity是1   size是1
代码: v.push_back(a1);
v的capacity和size都为1  现在push之后空间不够  去开空间2大小
编号C复制构造函数
之后B会析构掉  因为之前的空间要删除
编号B析构函数
然后把要push进来的调用赋值构造函数来构建  放进新开的空间
编号D复制构造函数
程序结束  
调用vectore的析构函数  之后删除空间   调用空间存储的对象的析构函数
编号A析构函数
编号C析构函数
编号D析构函数
三、如何使用提高性能:

为了比较,我们用了三种方式来把100个数据存入vector中,分别是:1、直接每次push_back();2、使用resize()提前分配100个空间,然后push_back;3、使用reserve提前分配100个存储空间。

速度(快到慢):3>2>1

【注】:reserve分配空间  resize()会调用构造函数



时间:2014.10.14. 04:28:20     作息不太正常 = =



看了这篇博客加上自己实践:http://blog.csdn.net/mfcing/article/details/8746256

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值