Comparando métodos de alocação de memória
Veja a seguir uma breve comparação dos vários métodos de alocação de memória:
- Cotaskmemalloc
- Globalalloc
- Heapalloc
- Localalloc
- malloc
- novo
- Virtualalloc
Embora as funções GlobalAlloc, LocalAlloc e HeapAlloc aloquem memória do mesmo heap, cada uma fornece um conjunto ligeiramente diferente de funcionalidade. Por exemplo, HeapAlloc pode ser instruído a gerar uma exceção se a memória não puder ser alocada, uma funcionalidade não disponível com LocalAlloc. LocalAlloc dá suporte à alocação de identificadores que permitem que a memória subjacente seja movida por uma realocação sem alterar o valor do identificador, uma funcionalidade não disponível com HeapAlloc.
A partir do Windows de 32 bits, GlobalAlloc e LocalAlloc são implementados como funções wrapper que chamam HeapAlloc usando um identificador para o heap padrão do processo. Portanto, GlobalAlloc e LocalAlloc têm maior sobrecarga do que HeapAlloc.
Como os diferentes alocadores de heap fornecem funcionalidade distinta usando mecanismos diferentes, você deve liberar memória com a função correta. Por exemplo, a memória alocada com HeapAlloc deve ser liberada com HeapFree e não LocalFree ou GlobalFree. A memória alocada com GlobalAlloc ou LocalAlloc deve ser consultada, validada e liberada com a função global ou local correspondente.
A função VirtualAlloc permite que você especifique opções adicionais para alocação de memória. No entanto, suas alocações usam uma granularidade de página, portanto, o uso de VirtualAlloc pode resultar em maior uso de memória.
A função malloc tem a desvantagem de ser dependente do tempo de execução. O novo operador tem a desvantagem de ser dependente do compilador e dependente da linguagem.
A função CoTaskMemAlloc tem a vantagem de funcionar bem em C, C++ou Visual Basic. Também é a única maneira de compartilhar memória em um aplicativo baseado em COM, já que MIDL usa CoTaskMemAlloc e CoTaskMemFree para realizar marshaling de memória.
Exemplos
Tópicos relacionados