【发布时间】: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