std::unordered_map::reserve 是否保证只要映射中的元素较少就不会发生内存分配?

use*_*931 7 c++ memory unordered-map std language-lawyer

如果我将 std::unordered_map::reserve 与参数 n 一起使用,只要插入到映射中的元素少于 n 个,插入到映射中是否能保证不会导致堆分配?

小智 5

标准中似乎没有这样的保证。

此外,如果您查看一个实现 - 引用 gcc 附带的标头 (<bits/hashtable.h>):

就标准容器而言,哈希表类似于以下内容的聚合:

  • std::forward_list<_Node>包含元素
  • std::vector<std::forward_list<_Node>::iterator>代表桶

Reserve 确保您拥有适当数量的存储桶,并适当调整该向量的大小。因此至少不会再为新的存储桶分配更多的资源。但存储桶是内部链接列表,向其中插入元素必须分配一个新的 _Node。

总的来说:不,即使在保留适当的容量之后,无序映射也可能(并且在 gcc 的情况下分配堆内存。