2013-02-17 11 views
5

Qual è la differenza tra l'allocazione della memoria tramite new/malloc e allocator?Qual è la differenza tra l'allocazione della memoria tramite il nuovo e l'allocatore

Perché mai avremmo bisogno di un allocatore di memoria separato per il vettore se abbiamo le opzioni di new e malloc?

+1

1 ricerca google: http://wiki.answers.com/Q/What_is_the_difference_between_malloc_and_new_other_than_syntax –

+2

Floris Velleman, non stavo cercando la differenza tra nuovo e cancella. – BJC

+3

Hmm. Non vedo come il "duplicato" risponda a questa domanda specifica. Bene, forse in parte ("gli allocatori sono collegabili") ma non affronta la domanda specifica sulla distinzione tra allocazione e costruzione. Non sono nemmeno sicuro del motivo del downvote. –

risposta

1

Eh, penso che new e malloc sono diversi e allocator fornisce diverse funzioni. malloc restituisce i dati non inizializzati e calloc restituisce zero dati -ed. Ma new chiamerebbe il costruttore se si sta creando un'istanza di qualche classe (non, bool questi tipi primitivi, che, a proposito, possono essere inizializzati pure). delete chiamerebbe il distruttore, mentre free no.

Come per allocator, fornisce un livello di astrazione per l'utente. allocator può restituire oggetti costruiti, spazio di memoria non inizializzato o distruggere un oggetto o rilasciare lo spazio. I contenitori STL utilizzano allocator per ottenere spazio di memoria e creare oggetti.

ma nota che come consuetudine allocator è possibile, un allocator non riesce necessariamente memoria come new/delete. Può creare un grosso blocco di memoria, quindi fare un po 'di cache di allocazione . Può restituire l'indirizzo di memoria nelle aree mappate ai file su disco in modo che i dati interni vadano nel file system mentre viene modificato dal livello superiore, contenitore. Inoltre può chiamare new per ottenere memoria. In questo modo, allocator consente all'utente di creare contenitori che si trovano in aree specifiche della memoria. Pertanto, con allocator s, la logica interna dei contenitori viene separata dal modo in cui viene gestita la memoria di archiviazione.

In realtà è possibile scrivere una classe derivata da std::allocator per implementare tutte le funzionalità sopra menzionate.


si potrebbe desiderare di leggere this per una discussione più dettagliata sul allocator s.

2

Quando si utilizza new o malloc, la gestione della memoria è cablata alle funzioni corrispondenti nel runtime del compilatore. Al contrario, quando viene utilizzato un allocatore, la gestione della memoria è delegata all'allocatore, che è scambiabile. Ciò consente di modificare le funzioni di gestione della memoria utilizzate.

Ci sono alcuni buoni motivi per avere questo livello extra di astrazione e controllo. Per esempio vedere: Compelling examples of custom C++ STL allocators?.

0

Nella classe allocator c'è un allocate() che richiede due parametri come segue:

pointer allocate (size_type n, allocator<void>::const_pointer hint=0); 

Secondo il riferimento of allocate() parametro suggerimento può essere utilizzato per migliorare le prestazioni ricordare che è necessario allocare un nuovo blocco di memoria adiacente a quella specificata. Quindi, credo che usando il suggerimento puoi assegnare blocchi in modo tale che siano sequenziali come nel caso di un array.

Problemi correlati