gpt4 book ai didi

c++ - std::unordered_set::reserve 对容器内存需求的作用?

转载 作者:搜寻专家 更新时间:2023-10-31 01:26:27 27 4
gpt4 key购买 nike

假设我使用 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) , modulo 一些额外的内存,这里没有什么意义,因为它的顺序是 sizeof(size_t) .

但是,我事先知道要添加的元素个数,所以我调用:

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

考虑调用 std::vector::reserve 的并行,我猜这会避免潜在的开销,从而保证内存消耗约为 1*numberOfElements*sizeof(MyClass)。 (模一些额外的内存,再次订购 sizeof(size_t) )。

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

最佳答案

来自 this std::unordered_set::reserve reference

Sets the number of buckets to the number needed to accomodate at least count elements ...

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

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

关于c++ - std::unordered_set::reserve 对容器内存需求的作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55372630/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com