【问题标题】:Does std::vector::resize() ever reallocate when new size is smaller than current size? [duplicate]当新大小小于当前大小时,std::vector::resize() 是否会重新分配? [复制]
【发布时间】:2012-12-28 12:00:51
【问题描述】:

可能重复:
std::vector resize downward

如果我将resize()std::vector 缩小到比其当前大小小一些,向量是否有可能分配新内存?

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

【问题讨论】:

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


【解决方案1】:

不,resizeing 到更小的大小将永远不会重新分配。

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

(来自here

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

【讨论】:

  • 需要明确的是,这并不是它不会重新分配的正式保证。但很难想象它是怎么做到的,因为它必须找到某种方法来保持迭代器的有效性,而每一种可以想象的方法都是可怕的。 (据推测,只有当它使事情变得更好时,一个实现才会这样做,在这种情况下,您应该很高兴它可以使事情变得比不重新分配更好。)
  • 我相信在 vector 的情况下,标准对重新分配非常具体。
  • @DeadMG:你对vector 的看法可能是对的,因为它的迭代器已经非常受限了。
  • @DavidSchwartz - 公平点。 C++ 的精确法则总能吸引我的注意力。不过,我宁愿怀疑 DeadMG 是正确的,这令人鼓舞。
  • @DavidSchwartz:对于迭代器来说,这很容易,但是对于指针和引用,项目不能在内存中移动。
【解决方案2】:

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

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

【讨论】:

  • +1 用于提及shrink_to_fit。但严格来说,这只是一个建议。即使对于这个函数,实现也不需要缩小向量(尽管如果不这样做确实会很奇怪)。
【解决方案3】:

没有。 vector 永远不会缩小它的内存,除非在一些非常特殊的情况下。请记住,当vector 调整大小时,迭代器会失效,因此它不能在你背后做这件事——这是一个可观察到的变化,标准明确规定了这可能会或可能不会发生的时间。

【讨论】:

  • 你能详细说说你提到的具体情况吗?
【解决方案4】:

没有。

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

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

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

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

【讨论】:

    【解决方案5】:

    首先你必须衡量你想要优化的东西,仅仅性能是不够的,你是什么意思? 用户界面反应性?这需要您测量时间的典型用户操作。 重算法?等等 ... 然后你必须找到瓶颈在哪里,可能是内存、磁盘访问等,最后可能是vector::resize,但只在最后! 而且你问问题的方式,我敢打赌我的 $ that vector::resize 不会成为瓶颈。

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

    【讨论】:

    • 可能会降低内存使用率。这也是衡量“性能”的一种方式。
    • @CashCow 我不同意,您可能很容易想象内存占用尽可能低且用户响应能力差的场景,很多时候,并非总是说,“性能”是多因素的,因为你增加了一些你减少了另一个的东西,所以你没有精确地定义,用一个衡量标准,什么是“性能”,你不能在它上面工作。您可能会在优化一个场景时浪费很多天,然后发现,最好是通过一个客户关键项目,您的 vector::resize 优化对另一个场景的副作用很差......
    猜你喜欢
    • 2020-10-11
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2012-09-24
    • 2014-02-22
    • 2012-04-25
    • 1970-01-01
    相关资源
    最近更新 更多