std::unordered_set::保留容器内存要求的角色?
Role of std::unordered_set::reserve for container memory requirement?
假设我使用std::unordered_set<MyClass>
,并假设sizeof(MyClass)
很大,即比sizeof(size_t)
和sizeof(void*)
大得多。我将向无序集合添加大量numberOfElementsToBeAdded
元素。
从 https://stackoverflow.com/a/25438497/4237,我发现: "每个内存分配可以四舍五入到便于内存分配库管理的大小 - 例如,下一个 2 的幂,接近 100% 的最坏情况低效和 50% 的平均值,所以让我们添加 50%,仅用于列表节点,因为存储桶可能是给定size_t和指针的 2 的幂: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)
(模化一些额外的内存,再次是sizeof(size_t)
级)。
我可以依靠标准库的实现来保证像这样的调用reserve
将避免上述答案中提到的 0-100%(平均 50%)开销吗?
来自此std::unordered_set::reserve
参考
将存储桶数设置为容纳至少
count
个元素所需的数量...
还有更多,但要点是std::unordered_set::reserve
实际上并不像std::vector::reserve
那样工作。对于无序集合,它为哈希表分配存储桶,而不是为实际元素本身分配内存。
该集合可以为每个存储桶放置一个元素,但不能保证。
引用标准:
将存储桶数设置为至少容纳存储桶所需的数量 在不超过最大负载系数的情况下对元素进行计数,并重新散列 容器,即将元素放入适当的存储桶中,考虑 存储桶总数已更改
重要的部分是**至少*。我认为您不能依赖该实现并确保它仅使用较少的内存量。我的猜测是,无论您是否调用reserve
numElements
的内存使用情况都将相似。
- 将字符串存储在c++中的稳定内存中
- C++ 指针的内存地址和指向数组的内存地址如何相同?
- Win32编译器选项和内存分配
- 当vector是tje全局变量时,c++中vector的内存管理
- 带内存和隔离功能的SQLite
- 是否可以通过C++扩展强制多个python进程共享同一内存
- 迭代时从向量和内存中删除对象
- 在C++中打印指向不同基元数据类型的指针的内存地址
- 这个指针和内存代码打印是什么?我不知道是打印垃圾还是如何打印我需要的值
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 为什么示例代码访问IUnknown中已删除的内存
- 如何在C++类内存结构中创建"spacer"?
- 从构造函数抛出异常时如何克服内存泄漏
- malloc() 可能出现内存泄漏
- 如何理解将半精度指针转换为无符号长指针和相关的内存对齐
- 在调用FreeLibrary后,释放动态链接到具有相同版本的CRT堆的DLL的内存
- 如何针对特定情况调试和修复此双自由内存损坏问题
- 类型总是使用其大小存储在内存中吗
- 有没有一种方法可以测量c++程序的运行时内存使用情况
- std::unordered_set::保留容器内存要求的角色?