【问题标题】:Remaining memory before relocating vector c++重定位向量c ++之前的剩余内存
【发布时间】:2018-04-19 08:40:20
【问题描述】:

假设我使用的是 int a 的向量:

vector<int> a {1, 2, 34, 1222, 0};

然后,我想 push_back 一些这样的数据:

a.push_back (data);

但是,我的程序必须在我的向量上添加大量数据。

我正在在一本书上学习 C++。这本书说:“添加一个元素有时可能需要分配额外的存储空间。在这种情况下,必须将每个元素移动到新的存储空间中”,c++ Ressources Network 补充说:“就处理时间而言,这是一项相对昂贵的任务。 ”。我还找到了关于该主题的article

但是,我的程序必须非常快。所以,我无法处理我的向量的这种“重新定位”。事实上,我的向量的大小可以超过 1GO 的内存。


我的问题很简单:

在重定位我的巨大向量之前如何知道剩余内存?


注意:我不知道向量的最终大小,因此我无法对其进行初始化以保留必要的内存。

如果您有任何问题或一些 cmets,请告诉我。

【问题讨论】:

  • std::vector::capacity 返回容器当前为其分配空间的元素数量。 当您插入一个元素并且std::vector::capacity 等于std::vector::size 时,就会发生重新分配。
  • 您系统的剩余内存还是向量中的剩余/保留内存?
  • 您不应该真正担心矢量内部结构。它工作得很好。不同的容器对于不同的任务有不同的复杂性。选择最适合您的用例的一种。
  • 这看起来像XY Problem。您实际上想解决什么问题?
  • 如果那篇文章没有提到向量的容量或vector::reserve,那么它就没有抓住重点

标签: c++


【解决方案1】:

std::vector 有针对这种情况的方法:

capacity() 返回当前已分配内存的元素数量。所以如果vector中的元素数量超过这个数量,就会发生重新分配

reserve() 为给定数量的元素分配内存。如果给定的数字小于capacity(),它什么也不做。否则,它会重新分配以提供所需的容量。

【讨论】:

    【解决方案2】:

    如果您知道您的 vector 最终会有多大,那么您可以使用 std::vector::reserve 来避免任何重新分配,但您说这是不可能的。

    vector::push_back 保证为摊销常数。它通过分配比它需要的更多的内存来实现这一点。随着vector 变大,重新分配将越来越少。 vector 就是为此而设计的,因此我建议您尝试一下,然后测量性能以查看重新分配是否存在问题。

    【讨论】:

    • 如果经过测量,性能仍然存在问题,切换到std::deque 变化很小,只要您不需要ContiguousContainer 就很安全
    • @Caleth 当然。但不能保证std::deque 会提高性能。 std::vector 将具有更好的数据局部性。使用std::deque 分配会更快,但如果容器很大,它总共需要进行更多的分配。
    猜你喜欢
    • 2019-04-26
    • 1970-01-01
    • 2010-11-11
    • 2015-12-26
    • 2017-01-08
    • 2021-03-18
    • 2013-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多