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

Posted

技术标签:

【中文标题】std::unordered_map::reserve 是不是保证只要映射中的元素较少就不会发生内存分配?【英文标题】:does std::unordered_map::reserve guarantee that no memory allocation will happen so long as there are fewer elements in the map?std::unordered_map::reserve 是否保证只要映射中的元素较少就不会发生内存分配? 【发布时间】:2020-09-03 12:08:46 【问题描述】:

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

【问题讨论】:

请注意,max_load_factor 不需要是一个或多个。即使你有一半的桶是空的,你也可能面临重新散列。 【参考方案1】:

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

此外,如果您查看实现 - 引用 gcc () 附带的标头:

就标准容器而言,哈希表就像 聚合:

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

reserve 确保您拥有适当数量的桶,它会适当地调整该向量的大小。所以至少不会有新的桶分配。但是桶是内部链表,向其中插入一个元素必须分配一个新的_Node。

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

【讨论】:

以上是关于std::unordered_map::reserve 是不是保证只要映射中的元素较少就不会发生内存分配?的主要内容,如果未能解决你的问题,请参考以下文章