您当前的位置: 首页 > 

我什么都布吉岛

暂无认证

  • 2浏览

    0关注

    292博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

初识vector内存增长机制

我什么都布吉岛 发布时间:2020-05-07 13:33:27 ,浏览量:2

一、vector的特点
  • 动态性,空间大小既可以增大亦可以减少;
  • 连续性,vector元素序列在空间地址是连续分布的;
  • 稳定性,vector元素序列在空间地址是相对固定的。
1.1 vector的动态性

vector常常被称为动态数组,这里的“动”应该相对于内置数组中的“静”,声明一个内置数组意味着最大容量已经确定,反之,动态数组则可以根据用户的需要进行调整。

1.2 vector的连续性

vector的元素序列存储是一段连续的内存区间,内存区间的划取由编译器决定,vector所能容纳的最大元素个数称之为容量(capacity),目前已经存放的元素个数为(size),构造一个vector对象时capacity=size,在添加一个元素后,存在size>capacity,此时必须增加capacity++,同时编译器必须重新分配内存并将原有数据拷贝至新的内存空间,最后写入新的元素。可见按照一次增加一个capacity的方法需要三步:

  • 重新划分内存
  • 复制原有元素个数
  • 写入新的数据

如果程序再次增加一个元素,需要重新经过上述三个步骤,性能将会慢到不可接受[1]

1.3 vector的稳定性

为了提高性能,空间换取时间是一个解决方法。即每一次分配一个比新的空间更大的内存空间,通常的策略是分配一个比capacity=2size,或capacity=1.5size[2]。此时vector将会有一定的capacity的稳定性,他的代价是占用了大于size的capacity空间。当然在你也可以手动回收和设置分配策略,其方法是通过下面两个方法:

  • shrink_to_fit() 尝试回收尚未使用的capacity空间
  • reserve(n) 显式告知编译器需要的capacity空间大小

另,我们可以通过调用capacity(),查看capacity空间大小。

小结:
  • vector的三个特点:动态、连续和稳定性
  • vector通常会分配比实际size更大的capacity以减少内存操作,这是一种空间换取时间的思想
  • vector在C++11下可以通过shrink_to_fit来回收多余空间,reserve控制capacity大小

[1] C++ primer 5th P317 [2] 取决于编译器具体的实现

关注
打赏
1658157489
查看更多评论
立即登录/注册

微信扫码登录

0.0347s