2010-03-31 8 views
6

Perché boost :: fast_pool_allocator è stato creato su un pool singleton e non su un pool separato per istanza di allocatore? O per dirla in altro modo, perché fornire solo questo, e non l'opzione di avere un pool per allocatore? Avere che sarebbe una cattiva idea?boost pool_alloc

Ho una classe che utilizza internamente circa 10 diversi tipi boost :: unordered_map. Se avessi usato std :: allocator, tutta la memoria tornerebbe al sistema quando chiamava delete, mentre ora devo chiamare release_memory su molti tipi di allocatori diversi ad un certo punto. Sarei stupido a rotolare il mio allocatore che usa pool invece di singleton_pool?

grazie

risposta

4

E 'difficile per un allocatore di avere stato, dal momento che tutte le istanze di un allocatore dovevano essere 'equivalente' per essere utilizzato dalla libreria standard (almeno portabile).

Da 20.1.5/4 "Requisiti Allocator":

implementazioni di contenitori descritti nella presente norma internazionale sono autorizzati a supporre che il loro parametro di modello Allocatore soddisfi i seguenti due requisiti aggiuntivi rispetto a quelli nella tabella 32.

  • Tutte le istanze di un dato tipo allocatore devono essere intercambiabili e sempre risultano uguali tra loro

Si passa poi a dire:

Implementors sono incoraggiati a fornire le librerie che possono accettare ripartitori che incapsulano modelli di memoria più generali e che il sostegno casi non uguali. In tali implementazioni, qualsiasi requisito imposto agli allocatori da parte dei contenitori oltre i requisiti visualizzati nella Tabella 32 e la semantica dei contenitori e degli algoritmi quando le istanze allocator si confrontano con non uguali, sono definiti dall'implementazione.

Quindi è possibile scrivere un'implementazione per consentire istanze di allocatore non equivalenti, ma l'allocatore dipende dal comportamento definito dall'implementazione.

Vedi this other SO answer per alcuni dettagli aggiuntivi (e sembra che ho bisogno di tendere a qualche aggiornamento promesso di quella risposta ...)

+0

Hmm, errori cestinato il mio ultimo commento. Grazie per la spiegazione. Forse riuscirò a farla franca se proverò a usare unordered_map, ed eviterò unordered_map :: operator = o unordered_map :: swap –

+0

Questo in realtà cambierà in C++ 0x. –