Condividi tramite


Confronto dei metodi di allocazione della memoria

Di seguito è riportato un breve confronto dei vari metodi di allocazione della memoria:

Anche se le funzioni GlobalAlloc, LocalAlloc e HeapAlloc allocano la memoria dallo stesso heap , ognuna fornisce un set leggermente diverso di funzionalità. Ad esempio, HeapAlloc può essere incaricato di generare un'eccezione se la memoria non può essere allocata, una funzionalità non disponibile con LocalAlloc. LocalAlloc supporta l'allocazione di handle che consentono lo spostamento della memoria sottostante da una riallocazione senza modificare il valore dell'handle, una funzionalità non disponibile con HeapAlloc.

A partire da Windows a 32 bit, GlobalAlloc e LocalAlloc vengono implementati come funzioni wrapper che chiamano HeapAlloc usando un handle per l'heap predefinito del processo. Pertanto, GlobalAlloc e LocalAlloc hanno un sovraccarico maggiore di HeapAlloc.

Poiché i diversi allocatori heap offrono funzionalità distintive usando meccanismi diversi, è necessario liberare memoria con la funzione corretta. Ad esempio, la memoria allocata con HeapAlloc deve essere liberata con HeapFree e non LocalFree o GlobalFree. La memoria allocata con GlobalAlloc o LocalAlloc deve essere eseguita una query, convalidata e rilasciata con la funzione globale o locale corrispondente.

La funzione VirtualAlloc consente di specificare opzioni aggiuntive per l'allocazione della memoria. Tuttavia, le allocazioni usano una granularità di pagina, quindi l'uso di VirtualAlloc può comportare un utilizzo di memoria superiore.

La funzione malloc ha lo svantaggio di essere dipendente dal tempo di esecuzione. Il nuovo operatore ha lo svantaggio di essere dipendente dal compilatore e dipendente dal linguaggio.

La funzione CoTaskMemAlloc ha il vantaggio di funzionare bene in C, C++o Visual Basic. È anche l'unico modo per condividere la memoria in un'applicazione basata su COM, poiché MIDL usa CoTaskMemAlloc e CoTaskMemFree per eseguire il marshalling della memoria.

Esempio

Funzioni globali e locali

Funzioni heap

Funzioni di memoria virtuale