如果std::unordered_map<int,...>
保持大致相同的大小但不断添加和删除项目,它是否会不断分配和释放内存或缓存并重用内存(即像池或向量)?假设库的现代标准MS实现。
答案 0 :(得分:0)
标准并未具体涉及这些方面,因此它们是实现定义的。最值得注意的是,您描述的缓存行为通常是通过使用自定义分配器(例如,对于memory pool allocator)实现的,因此通常应该与容器实现分离。
关于无序容器的the standard, ~p874的相关位:
无序关联容器的元素被组织成 桶。具有相同哈希码的密钥出现在同一个存储桶中。该 添加元素时,桶的数量会自动增加 一个无序的关联容器,这样的平均数 每桶的元素保持在一个界限之下。
并插入:
插入和安置成员不得影响其有效性 迭代器if(N + n)&lt; = z * B,其中N是元素的数量 在插入操作之前的容器中,n是元素的数量 插入,B是容器的桶数,z是容器的 最大载荷系数
您可以在行之间读取并假设由于迭代器有效性不受影响,因此可能不会进行内存分配。虽然这绝不是保证(例如,如果存储区数据结构是链表,您可以附加到它而不会使迭代器失效)。标准似乎没有指定删除元素时应该发生什么,但由于它无法使上述约束无效,因此我没有看到解除内存释放的原因。
确定具体实施的最简单方法是阅读源代码或配置代码。
或者,您可以尝试使用rehash
和resize
方法并调整地图的load_factor来控制此行为(如果确实需要)。