2011-01-09 11 views
15

Ho sentito parlare di persone che utilizzano allocatori di memoria personalizzati per il loro progetto, in particolare in C++.C++: allocatori di memoria

  • Che cosa è un allocatore di memoria personalizzato, rispetto a malloc?

  • Non è malloc il livello più basso che puoi già percorrere?

+1

@muntoo: che non menziona ripartitori a tutti. – jalf

+0

@jalf Sto ancora imparando a leggere. –

risposta

18

Una memoria allocatore non è livello inferiore rispettomalloc. (L'allocatore predefinito chiama in genere malloc direttamente o indirettamente)

Un allocatore consente solo di specificare diverse strategie di allocazione. Ad esempio, è possibile utilizzare un allocatore che chiama una volta malloc per recuperare un grande pool di memoria e quindi per le richieste di allocazione successive, restituisce solo una piccola porzione di questo pool.

Oppure è possibile utilizzarlo come un gancio per consentire di eseguire un compito aggiuntivo ogni volta che la memoria viene allocata o liberata.

Per quanto riguarda la seconda domanda, malloc è il più basso possibile senza perdere la portabilità. malloc viene in genere implementato utilizzando una funzione di allocazione della memoria specifica del sistema operativo, in modo tale che il livello sia inferiore. Ma questo non è correlato alla tua domanda principale, poiché gli allocatori C++ sono un'astrazione di livello superiore.

+1

+ 1- ci sono molte strategie di allocazione, malloc è solo uno che ha lo scopo di essere il più genericamente performante possibile. – Puppy

5

Un allocatore di memoria personalizzata è un sostituto per malloc (in realtà, di solito un sostituto per operator new) che recupera blocchi di byte in qualche modo diverso da quello predefinito. malloc non è il livello più basso possibile, perché lo stesso malloc viene implementato in termini di primitive ancora più semplici dal sistema operativo che allocano blocchi di memoria per il partizionamento.

I casi di utilizzo comune per la creazione di allocatori personalizzati stanno ottimizzando le allocazioni di piccoli oggetti (l'allocatore predefinito di solito è davvero pessimo), allocando in modo tale da garantire una buona localizzazione (allocando oggetti vicini l'uno all'altro), allocando con la registrazione/tracking (per diagnosticare perdite), allocazione da un pool di risorse raccolte dalla garbage, ecc. Sono disponibili molte opzioni diverse e molti programmi possono spremere un po 'più di prestazioni utilizzando questi allocatori personalizzati.

1

malloc() è una funzione di libreria in libc (o glibc) che effettua una chiamata di sistema sbrk() quando è necessario allocare più memoria al processo. Insieme, malloc() e free() gestiscono un elenco di blocchi di memoria che vengono utilizzati quando vengono chiamati malloc(), calloc() ecc.

È possibile utilizzare un allocatore personalizzato quando non si desidera il comportamento di malloc() o si desidera eseguire ulteriori lavori su malloc/free.

+1

'malloc' non chiama' sbrk() 'su Windows. ;) Questo è solo un dettaglio di implementazione nel tuo sistema operativo, niente a che vedere con 'malloc' stesso. – jalf

+0

True :) Bias della piattaforma ... –

16

C'è una descrizione dettagliata degli allocatori personalizzati, insieme alla loro valutazione empirica, nel seguente articolo (che ho scritto insieme). Prima di decidere di utilizzare gli allocatori personalizzati in il tuo progetto C++, dovresti dare una lettura a questo documento. La panoramica generale è un buon allocatore generale è migliore (più rapido e più efficiente in termini di spazio) rispetto a tutti gli stili di allocatori personalizzati eccetto le regioni, ma questi hanno seri problemi.

Reconsidering personalizzato di allocazione memoria (ACM link, direct PDF link, Powerpoint talk slides), OOPSLA 2002.

programmatori che sperano di ottenere miglioramenti delle prestazioni spesso usano ripartitori di memoria personalizzato. Questo studio approfondito esamina otto applicazioni che utilizzano gli allocatori personalizzati . Sorprendentemente, per sei di queste applicazioni, un allocatore generico allo stato dell'arte (l'allocatore Lea ) ha prestazioni migliori o pari a migliori degli allocatori personalizzati. Le due eccezioni utilizzano le regioni, che offrono prestazioni superiori a (miglioramenti fino al 44%). Le aree riducono anche il carico del programmatore e eliminano una fonte di perdite di memoria. Tuttavia, dimostriamo che l'incapacità dei programmatori di liberare singoli oggetti all'interno delle regioni può portare a un notevole aumento di memoria nella memoria consumo. Peggio ancora, questa limitazione preclude l'uso di regioni per linguaggi di programmazione comuni, riducendo loro usefulness.We presentano una generalizzazione di impiego generale e allocatori basati sulle regioni che chiamiamo miete. I reap sono una combinazione di aree e cumuli , che forniscono un intervallo completo di semantica di area con l'aggiunta di oggetto individuale . Dimostriamo che la nostra implementazione di reaps offre prestazioni elevate a , superando gli altri allocatori con semantica di tipo region. Quindi utilizziamo un case study su per dimostrare i vantaggi dello spazio e i vantaggi dell'ingegneria del software di razzi nella pratica. I nostri risultati indicano che i programmatori che necessitano di regioni veloci devono utilizzare i reap e che la maggior parte dei programmatori si deve utilizzare l'allocatore Lea .

2

Gli allocatori di memoria sono utilizzati come ottimizzazioni per la velocità. Le allocazioni dal sistema operativo sono lente. Quindi il tuo gestore di memoria prende un grande secchio di memoria e quindi effettua le allocazioni per te da quel secchio di memoria senza passare attraverso il sistema operativo. Questa tecnica è più frequentemente utilizzata in giochi/console/sistemi incorporati.

http://www.memorymanagement.org/articles/

http://www.ibm.com/developerworks/aix/tutorials/au-memorymanager/au-memorymanager-pdf.pdf