2013-10-22 6 views
5

Sembra che le funzioni di riserva/risistemazione pre-allocano solo il numero di bucket, non la memoria per le coppie di elementi (chiave, vlaue) da inserito.C++ unordered_map c'è un modo per pre-allocare memoria per gli elementi se la dimensione massima è conosciuta in anticipo

C'è un modo in grado di pre-allocare memoria per elementi anche, così applicazioni a bassa latenza non hanno bisogno di perdere tempo in allocazione dinamica della memoria.

+0

È possibile impostare la dimensione della benna e il numero di benne che corrisponderanno alle dimensioni della mappa – aaronman

+0

Ho provato 'reserve' utilizzando un tipo con effetto collaterale nel suo costruttore. Sembra che in realtà non riserva memoria né per le chiavi, né per i valori. http://ideone.com/yH746X –

+0

@ polkovnikov.ph Sono d'accordo, si riserva solo spazio per i secchi non per chiavi e valori – Medicine

risposta

2

Una possibilità potrebbe essere quella di scrivere il proprio allocatore. Questo può essere particolarmente efficace se si dispone di almeno una buona idea di quanti elementi sono suscettibili di andare nella tabella (in modo da poter pre-allocare spazio per tutti) e non si cura di ri-utilizzando lo spazio per gli oggetti se vengono rimossi dal tavolo (quindi la vostra contabilità è semplice).

In tal caso, si può sostanzialmente pre-allocare spazio per N oggetti, e semplicemente tenere traccia della posizione dell'elemento successivo da assegnare. Assegnare l'oggetto consiste semplicemente nel restituire l'indirizzo e incrementare il puntatore, come in

Naturalmente, questo non elimina veramente l'allocazione dinamica - lo rende abbastanza economico che probabilmente non ti interessa più (e dato che è fornito come parametro template, c'è una buona probabilità che venga espanso in linea, quindi non si ottiene nemmeno il sovraccarico di una chiamata di funzione nel processo

Anche se non si riesce a mettere con abbastanza restrittivo di un allocatore, un allocatore general-purpose per oggetti a dimensione fissa sarà sempre (almeno in qualche modo) più veloce di uno per dimensioni variabili di oggetti, ma non eliminerà l'allocazione dinamica, ma potrebbe dare abbastanza miglioramento della velocità per lavorare abbastanza un po 'meglio per il tuo scopo.