Mi chiedo perché sia C++ 11 che l'hashmap di Boost non si ridimensionino durante la cancellazione degli elementi tramite l'iterazione. Anche se tecnicamente non è una perdita di memoria, penso che potrebbe essere un problema serio nelle applicazioni (è stato un problema nascosto per me, ha avuto difficoltà a rintracciarlo) e potrebbe effettivamente interessare molte applicazioni. Si tratta di un "difetto di progettazione" con il contenitore?Perché C++ 11/Boost `unordered_map` non rihash durante la cancellazione?
I benchmark e sembra essere che interessano diverse versioni del compilatore (tra cui VS, Clang, GCC)
Il codice per riprodurre il problema è:
std::unordered_map<T1,T2> m;
for (int i = 0; i < 5000000; i++)
m.insert(std::make_pair(i, new data_type));
for (map_type::iterator it = m.begin(); it != m.end();) {
delete it->second;
it = m.erase(it);
}
ho creato un file self-contained test che utilizzano un allocatore personalizzato per tenere traccia dell'utilizzo della memoria.
Finché ho capito, il motivo dietro che sta permettendo elementi cancellazione attraverso iterazione e mantenere iteratori validi per non elementi cancellati .. Che sembra un po 'strano requisito in quanto l'inserimento di elementi potrebbe causare un re-hash che invalidare iteratori comunque.
Ma si potrebbe distruggere la mappa direttamente ..
Quale è come mi fisso che (ho avvolto la mappa all'interno di un puntatore intelligente e quando è vuoto ho semplicemente ricreare una nuova mappa vuota, portato per essere più veloce di rilanciare, non so perché.).
In generale, tutte le applicazioni che utilizzano unordered_map
come contenitore per gli elementi di cache potrebbe soffrire di tale questione (si consiglia di rimuovere gli elementi dalla cache, ma di solito non si fare un "Reset cache")
Sì spiacente. Grazie per la modifica – GameDeveloper
, penso che tu abbia risposto correttamente alla tua domanda. Sei solo in disaccordo con la logica. Ecco un link alla proposta che include la motivazione del design: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2003/n1456.html –
Indica che quando si cancellano solo gli iteratori su elementi cancellati dovrebbe essere invalidato, senza dare una buona ragione per quello (sembra una delle poche affermazioni che non sono motivate nell'intera lettura) .. grazie per averlo collegato. – GameDeveloper