0

如果一個std::unordered_map<int,...>保持大致相同的大小,但不斷添加和刪除項目,它會不斷分配和釋放內存或緩存並重新使用內存(即像池或向量)?假設庫的現代標準MS實現。使用unordered_map時的內存分配

+1

看看你的實現的源代碼。 –

+0

標準容器應該使用其分配器參數來管理內存。他們不應該試圖猜測在那裏使用的算法,並持有額外的可重用內存塊緩存。 –

回答

0

該標準對這些方面沒有具體說明,因此它們都是實現定義的。最值得注意的是,像您描述的緩存行爲通常通過使用自定義分配器(例如,對於memory pool allocator)來實現,因此通常應該從容器實現中分離出來。

the standard, ~p874約無序容器中的相關位:

一個無序關聯容器的元件被組織成 桶。具有相同散列碼的密鑰出現在同一個存儲桶中。 桶的數量自動增加,因爲元素被添加到一個無序的關聯容器中,因此每個桶的平均數量爲 元素被保持在界限以下。

和插入:

插入件和佈設成員不應影響 迭代器的有效性,如果(N + N)< = Z * B,其中N是在 元件的數量容器之前的插入操作中,n是元素 插入的數目,B是容器的桶數,和z是容器的 最大負載因子

你可以在行之間讀取,並假設由於迭代器有效性不受影響,可能不會發生內存分配。儘管這不是保證的(例如,如果存儲區數據結構是鏈接列表,您可以附加到它而不會使迭代器失效)。該標準似乎沒有指定當元素被移除時應該發生什麼,但是因爲它不能使上面的約束無效,所以我沒有看到釋放內存的理由。

找出您的具體實現的最簡單方法是閱讀代碼的源代碼或配置文件。 或者,您可以嘗試通過使用rehashresize方法並調整地圖的load_factor來控制此行爲(如果確實需要)。