如果一個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. 使用MemoryStream分配內存
- 2. 使用mmap分配內存
- 3. 使用calloc分配內存
- 4. 使用malloc()分配內存
- 5. 使用AWE分配內存
- 6. 使用的sizeof()的malloc分配內存
- 7. 取消分配CGContextDrawPDFPage使用的內存
- 8. 使用數組的內存分配
- 9. 使用Apache2的Tomcat6內存分配
- 10. 使用dts配置分配啓動時間內存
- 11. 使用多線程分配內存時出現分段錯誤
- 12. 內存分配
- 13. 內存分配
- 14. 內存分配
- 15. 內存分配
- 16. 內存分配
- 17. 內存分配
- 18. 內存分配
- 19. 分配內存
- 20. 內存分配
- 21. 內存分配
- 22. 內存分配
- 23. 內存分配
- 24. 內存分配
- 25. Sonatype Nexus使用的內存大於分配的內存
- 26. 在C++中用void *分配內存結構內存分配
- 27. 使用C#和C++非託管時的內存分配/取消分配
- 28. 內存重新分配使用的std ::矢量重新分配
- 29. 使用malloc分配沒有分配的內存,怎麼樣?
- 30. 內存分配和進程的內存使用
看看你的實現的源代碼。 –
標準容器應該使用其分配器參數來管理內存。他們不應該試圖猜測在那裏使用的算法,並持有額外的可重用內存塊緩存。 –