【问题标题】:For a std::vector, will reserve(largeNumber) need more work than reserve(smallNumber)?对于 std::vector,reserve(largeNumber) 是否需要比 reserve(smallNumber) 更多的工作?
【发布时间】:2016-10-17 12:36:27
【问题描述】:

我经常遇到这样的情况,我知道std::vector 在完成工作后将包含最大数量的元素;假设是 10000。但是它可以很容易地包含更少的元素,例如 100。没有办法知道有多少元素得到.emplaced_back(...)

当然,如果有 10000 次调用 emplace back,向量将重新分配几次。但如果只插入 100 个元素,那就更少了。

我的问题是,打电话给.reserve(10000) 会是一件坏事吗?分配内存是否需要“线性”工作,或者它甚至是恒定的,因此不会产生负面影响,即使大部分向量没有被使用?如果出现这种情况,需要考虑哪些要点?

注意: 前段时间我做了一些分析,结果使用reserve(someIntermediateNumer) -might- 有优势。然而,由于我的程序并不是真正的确定性(我在真实代码上测试过),因此结果并不是真正具有决定性的。我对此的兴趣部分也与理论有关。

【问题讨论】:

  • 你应该对你的运行时行为进行一些统计分析。
  • 您是否更有可能拥有较小的较大向量?
  • 地址空间有多少溢价?
  • en.cppreference.com/w/cpp/container/vector/reserve 它“最多是线性的”。如果您不关心“浪费”的内存,它不会受到伤害。
  • 除非您需要恢复内存,否则不要费心缩小以适应。无论如何,它可能不会做任何事情。

标签: c++ vector


【解决方案1】:

在 std::vector 中,reserve() 不会比 reserve() 做更多的工作。在这两种情况下,都会执行一次内存分配。负面影响在别处;例如因为您的应用程序使用更多内存,它可能会在某些时候导致交换。

【讨论】:

    【解决方案2】:

    std::vector 性能可能取决于您的特定内存分配器。假设 linux,它可能是单个系统调用,甚至某些实现的所有用户空间取决于当前可用的内存。内核方面可能会有所不同,因为很有可能小内存块已经在缓存中,而大内存块将使用 sbrk 或 mmap 请求额外的 arena。最重要的是,页面错误和交换更有可能影响更大的块,但这些会在以后使用时发生。

    注意以上所有假设reserve确实是请求内存。因为某些实现可能已经在构造函数中分配了足够的空间来忽略您的请求。

    【讨论】:

      猜你喜欢
      • 2020-09-22
      • 2013-06-18
      • 2021-05-17
      • 2015-01-04
      • 2012-05-27
      • 1970-01-01
      • 2010-12-17
      相关资源
      最近更新 更多