【问题标题】:Memory allocations when using unordered_map使用 unordered_map 时的内存分配
【发布时间】:2016-09-24 09:40:09
【问题描述】:

如果std::unordered_map<int,...> 保持大致相同的大小但不断添加和删除项目,它会不断分配和释放内存还是缓存和重用内存(即像池或向量)?假设库的现代标准 MS 实现。

【问题讨论】:

  • 看看你的实现的源代码。
  • 标准容器应该使用它们的分配器参数来管理内存。他们不应该试图猜测那里使用的算法并持有额外的可重用内存块缓存。

标签: c++ c++11 memory-management unordered-map c++-standard-library


【解决方案1】:

标准没有具体说明这些方面,因此它们是由实现定义的。最值得注意的是,像您描述的缓存行为通常是通过使用 自定义分配器 来实现的(例如,对于 memory pool allocator),因此它通常应该与容器实现分离。

the standard, ~p874关于无序容器的相关位:

无序关联容器的元素被组织成 桶。具有相同哈希码的键出现在同一个桶中。这 随着元素的添加,桶的数量会自动增加 一个无序的关联容器,因此平均数 每个桶的元素保持在一个界限以下。

并插入:

insert 和 emplace 成员不影响 迭代器 if (N+n)

您可以在两行之间阅读并假设由于迭代器的有效性不受影响,因此可能不会发生内存分配。尽管这绝不是保证(例如,如果桶数据结构是一个链表,您可以附加到它而不会使迭代器失效)。该标准似乎没有指定删除元素时应该发生什么,但由于它不能使上面的约束无效,我看不出有理由释放内存。

确定您的具体实现的最简单方法是阅读源代码或分析您的代码。 或者,您可以尝试通过使用 rehashresize 方法并调整地图的 load_factor 来控制此行为(如果您确实需要)。

【讨论】:

  • unordered_map 不保证迭代器的稳定性。它提供了指针稳定性。这意味着每次插入/删除元素时进行分配/解除分配。
猜你喜欢
  • 1970-01-01
  • 2013-01-13
  • 1970-01-01
  • 2018-01-19
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 2018-06-06
相关资源
最近更新 更多