当新大小小于当前大小时,std :: vector :: resize()是否会重新分配?

时间:2013-01-14 14:04:13

标签: c++ c++11 std c++03 c++98

  

可能重复:
  std::vector resize downward

如果resize() std::vector的某个尺寸小于其当前尺寸,那么该矢量是否可能会分配新内存?

出于性能原因,这对我很重要。

5 个答案:

答案 0 :(得分:11)

不,resize更小的尺寸永远不会重新分配。

  

如果容器收缩,所有迭代器,指针和对尚未删除的元素的引用在调整大小后仍然有效,并引用它们在调用之前引用的相同元素。

(来自here

鉴于此,我们可以确定重新分配不会发生。

答案 1 :(得分:5)

resize()减少时仅更改逻辑大小。其他人已经回答了这个,所以我在这里没有添加任何内容。这样做的目的是优化速度,因为它不需要重新分配或移动任何数据。

但是,当您想要优化内存使用时,C ++ 11引入了另一个函数shrink_to_fit(),您可以在resize()之后(或甚至在任何其他时间)调用,这将实际确保你不支付你不想要的任何记忆。

答案 2 :(得分:1)

没有。除了一些非常具体的条件外,vector永远不会缩小它的记忆。请记住,当vector调整大小时,迭代器会失效,因此它无法在您的背后执行此操作 - 这是一个可观察到的更改,并且标准指定了这可能发生或不发生的确切时间。

答案 3 :(得分:1)

没有。

Vector使用两个值: size capacity 。大小是存储在向量中的实际元素数,而容量则是指内存中分配的保留空间。性能的提升来自于分配比所需更多的空间。

只有在执行大小超过当前容量的调整大小请求时,才会进行重新分配。此外,如果您尝试在向量的中间插入大量元素,它将影响算法性能,因为插入的元素之后的所有元素都需要移动(有时,如果超过容量,则可能会触发重新分配向量)。

您可以使用保留成员函数来进一步提高速度: reserve 成员函数将确保将容量设置为特定值。

您可以在第148页的书籍The C++ Standard Library: A Tutorial and Reference中阅读有关std :: vector的更多信息。

答案 4 :(得分:0)

首先,您必须衡量您想要优化的内容,仅靠性能是不够的,您的意思是什么? UI反应性?这需要您测量时间的典型用户操作。 重算法?等等 ... 然后你必须找到瓶颈的位置,可能是内存,磁盘访问等,最后可能是vector :: resize,但仅限于最后! 你问问题的方式,我打赌我的$ vector :: resize不会成为瓶颈。

对STL的设计方式充满信心,在修改STL行为之前检查代码; - )