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 是不是保证只要映射中的元素较少就不会发生内存分配?的主要内容,如果未能解决你的问题,请参考以下文章