【问题标题】:Role of std::unordered_set::reserve for container memory requirement?std::unordered_set::reserve 对容器内存要求的作用?
【发布时间】:2019-03-27 08:23:20
【问题描述】:

假设我使用std::unordered_set<MyClass>,并假设sizeof(MyClass) 很大,即比sizeof(size_t) 和sizeof(void*) 大得多。我将向无序集合中添加大量 numberOfElementsToBeAdded 元素。

从 https://stackoverflow.com/a/25438497/4237 ,我发现: “每个内存分配都可以向上取整到便于内存分配库管理的大小 - 例如,下一个 2 的幂,接近 100% 最坏情况下的低效率和 50% 平均值,所以让我们添加 50%,仅针对列表节点作为桶可能是两个给定 size_t 和一个指针的幂:50% * size() * (sizeof(void*) + sizeof((M::value_type))"

这使我得出结论,实际内存消耗将介于 1*numberOfElements*sizeof(MyClass) 和 (1+1)*numberOfElements*sizeof(MyClass),模 一些额外的内存,这里没什么兴趣,因为它是 sizeof(size_t) 的顺序。

不过,我事先知道要添加的元素数量,所以我调用:

std::unordered_set<MyClass> set;
set.reserve(numberOfElementsToBeAdded);
//Insert elements

考虑到调用 std::vector::reserve 的并行性,我猜这避免了潜在的开销,因此可以保证内存消耗大约为 1*numberOfElements*sizeof(MyClass)(模一些额外的内存,再次为 @987654332 @)。

我能否依靠标准库的实现来保证像这样调用reserve 将避免上述答案中提到的 0-100%(平均 50%)开销?

【问题讨论】:

    标签: c++ stl containers std


    【解决方案1】:

    来自this std::unordered_set::reserve reference

    将桶的数量设置为至少容纳count元素所需的数量...

    还有更多,但要点是 std::unordered_set::reserve 实际上并不像 std::vector::reserve 那样工作。对于无序集,它为哈希表分配桶,而不是为实际元素本身分配内存。

    集合可以每个桶放一个元素,但不能保证。

    【讨论】:

    • 对。调用std::unordered_set::reserve 的目的是避免重新调整内部用于索引集合的散列结构的大小。它(通常)对集合的实际成员的分配或存储方式没有影响。
    • 桶只需要 sizeof(size_t)/sizeof(void*) 内存还是它们(也)需要 sizeof(M:valuetype) = sizeof(MyClass) 内存?
    • @willem 这是一个未指定的特定于实现的细节。你必须检查你的实现。
    • @Someprogrammerdude 谢谢。您说“该集合可以在每个桶中放置一个元素,但不能保证。”我很难理解这意味着什么。我是否正确地说每个存储桶也可能少于 1 个元素/MyClass?
    • @willem 我不知道空桶会使用多少内存,因为这取决于实现。也感觉你没有告诉我们整个问题......为什么你需要知道?您需要解决的实际问题是什么?为什么您如此担心内存消耗(尤其是因为我们仍处于低个位数 MiB 范围内)?
    【解决方案2】:

    引用标准:

    将桶的数量设置为至少需要容纳的数量 在不超过最大负载因子的情况下计算元素并重新散列 容器,即将元素放入适当的桶中 桶的总数发生了变化

    重要的部分是**至少*。我认为您不能依赖实现并确保它只使用较少的内存。我的猜测是,无论您是否调用 reserve,numElements 的内存使用量都会相似。

    【讨论】:

      猜你喜欢
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 2012-09-27
      • 1970-01-01
      • 2017-12-19
      • 1970-01-01
      • 2022-06-13
      相关资源
      最近更新 更多