5
看起來像reserve/rehash函數只預先分配桶的數量,而不是內存中的元素(key,vlaue)對插入。C++ unordered_map是否有預先分配內存的方法,如果事先已知最大大小
有沒有一種方法可以爲元素預先分配內存,所以低延遲應用程序不需要浪費時間在動態內存分配上。
看起來像reserve/rehash函數只預先分配桶的數量,而不是內存中的元素(key,vlaue)對插入。C++ unordered_map是否有預先分配內存的方法,如果事先已知最大大小
有沒有一種方法可以爲元素預先分配內存,所以低延遲應用程序不需要浪費時間在動態內存分配上。
一種可能性是編寫自己的分配器。如果你至少有一個公平的想法,即表中可能包含多少項目(這樣你可以爲它們預先分配空間),並且不關心如何重新使用項目空間他們從桌子上移走(所以你的記賬很簡單)。
在這種情況下,您基本上可以爲N個對象預先分配空間,並簡單地跟蹤下一個要分配的項目的位置。分配對象包括簡單地返回地址並遞增指針,如return *next++;
當然,這並不能真正消除動態分配 - 它只是讓它足夠便宜,你可能不關心它任何更多(因爲它是作爲模板參數提供的,所以它很有可能在內聯中擴展,所以在進程中甚至不會獲得函數調用的開銷。)
即使你不能把與分配器的限制相比,固定大小對象的通用分配器通常(至少稍微)比可變大小的對象快,但它仍然不會消除動態分配,但它可能會充分提高工作速度你的目的更好一點。
您可以設置桶的大小和桶的數量,這將是地圖的大小 – aaronman
我已經在其構造函數中使用帶有副作用的類型測試過'reserve'。看起來它確實不會爲鍵和值保留內存。 http://ideone.com/yH746X –
@ polkovnikov.ph我同意它只保留存儲桶的空間不是用於鍵和值 – Medicine