如果一个std::unordered_map<int,...>
保持大致相同的大小,但不断添加和删除项目,它会不断分配和释放内存或缓存并重新使用内存(即像池或向量)?假设库的现代标准MS实现。使用unordered_map时的内存分配
0
A
回答
0
该标准对这些方面没有具体说明,因此它们都是实现定义的。最值得注意的是,像您描述的缓存行为通常通过使用自定义分配器(例如,对于memory pool allocator)来实现,因此通常应该从容器实现中分离出来。
的the standard, ~p874约无序容器中的相关位:
一个无序关联容器的元件被组织成 桶。具有相同散列码的密钥出现在同一个存储桶中。 桶的数量自动增加,因为元素被添加到一个无序的关联容器中,因此每个桶的平均数量为 元素被保持在界限以下。
和插入:
插入件和布设成员不应影响 迭代器的有效性,如果(N + N)< = Z * B,其中N是在 元件的数量容器之前的插入操作中,n是元素 插入的数目,B是容器的桶数,和z是容器的 最大负载因子
你可以在行之间读取,并假设由于迭代器有效性不受影响,可能不会发生内存分配。尽管这不是保证的(例如,如果存储区数据结构是链接列表,您可以附加到它而不会使迭代器失效)。该标准似乎没有指定当元素被移除时应该发生什么,但是因为它不能使上面的约束无效,所以我没有看到释放内存的理由。
找出您的具体实现的最简单方法是阅读代码的源代码或配置文件。 或者,您可以尝试通过使用rehash
和resize
方法并调整地图的load_factor来控制此行为(如果确实需要)。
相关问题
- 1. 使用AWE分配内存
- 2. 使用mmap分配内存
- 3. 使用MemoryStream分配内存
- 4. 使用calloc分配内存
- 5. 使用数组的内存分配
- 6. 取消分配CGContextDrawPDFPage使用的内存
- 7. 使用多线程分配内存时出现分段错误
- 8. 内存分配
- 9. 内存分配
- 10. 内存分配
- 11. 内存分配
- 12. 内存分配
- 13. 内存分配
- 14. 内存分配
- 15. 内存分配
- 16. 分配内存
- 17. 内存分配
- 18. 使用C#和C++非托管时的内存分配/取消分配
- 19. 使用malloc分配没有分配的内存,怎么样?
- 20. 预分配的线程安全unordered_map
- 21. 向量分配和内存使用
- 22. 动态内存分配和使用C
- 23. Python切片分配内存使用
- 24. 无法使用MALLOC分配内存
- 25. 使用malloc分配动态内存
- 26. 使用malloc动态分配内存()
- 27. Ç - 使用工会,分配内存
- 28. 使用impi库删除未分配内存时的问题
- 29. 如何跟踪使用智能指针时的内存分配
- 30. 使用mclapply时的内存分配错误
看看你的实现的源代码。 –
标准容器应该使用其分配器参数来管理内存。他们不应该试图猜测在那里使用的算法,并持有额外的可重用内存块缓存。 –