Comparação de Métodos de Alocação de Memória

Escolher o método de alocação correto

Use as seguintes orientações para selecionar a API de alocação de memória adequada para o seu cenário:

Scenario API recomendada Notes
Alocações de uso geral em C++ new / std::make_unique / std::make_shared Escolha padrão para código C++. Usa o CRT heap internamente. O RAII assegura limpeza automática.
Alocações C de uso geral malloc / calloc / realloc Escolha padrão para código C. Portátil entre plataformas.
Alocações superiores a ~1 MB ou que requerem controlo ao nível da página VirtualAlloc Aloca com granularidade de página (tipicamente 4 KB). Usar para reservar grandes intervalos de endereços, páginas de proteção ou memória com atributos de proteção específicos (PAGE_READWRITE, PAGE_EXECUTE_READ, etc.).
Muitas pequenas alocações com controlo personalizado (por exemplo, alocador de pool) HeapAlloc / HeapCreate Crie um heap privado para controlo de isolamento ou serialização. Use HEAP_NO_SERIALIZE apenas se o heap for exclusivamente single-threaded.
Interoperação COM (memória marshaled) CoTaskMemAlloc Obrigatório quando a memória ultrapassa os limites do apartamento da COM. Os stubs gerados pelo MIDL usam CoTaskMemAlloc/CoTaskMemFree.
Código legado usando memória móvel GlobalAlloc / LocalAlloc Evite para código novo. Estas adicionam sobrecarga ao HeapAlloc e existem principalmente para compatibilidade retrocedente com operações de prancha e certas APIs Win32 que as exigem.

Importante

Emparelhe sempre corretamente as funções de alocação e deslocação. A memória alocada com HeapAlloc deve ser libertada com HeapFree — not free() ou LocalFree. Misturar famílias de alocação/desalocação causa corrupção do heap que é difícil de diagnosticar.

Note

VirtualAlloc vs HeapAlloc: O VirtualAlloc opera com granularidade de página (mínimo 4 KB, reservas alinhadas para SYSTEM_INFO.dwAllocationGranularity, tipicamente 64 KB). Alocar muitos objetos pequenos com o VirtualAlloc desperdiça espaço de endereçamento. Use HeapAlloc (ou malloc/new) para alocações pequenas e frequentes. Use o VirtualAlloc quando precisar de reservar grandes regiões de endereço, controlar a proteção da página ou implementar alocadores personalizados.

Comparação detalhada

Segue-se uma breve comparação dos vários métodos de alocação de memória:

Embora as funções GlobalAlloc, LocalAlloc e HeapAlloc acabem por alocar memória do mesmo heap, cada uma fornece um conjunto ligeiramente diferente de funcionalidades. Por exemplo, o HeapAlloc pode ser instruído a criar uma exceção se a memória não puder ser alocada, uma capacidade que não está disponível com o LocalAlloc. O LocalAlloc suporta a alocação de handles que permitem que a memória subjacente seja movida por uma realocação sem alterar o valor do handle, uma funcionalidade que não está disponível com o HeapAlloc.

A partir do Windows de 32 bits, o GlobalAlloc e o LocalAlloc são implementados como funções envolventes que chamam o HeapAlloc usando um handle para o heap padrão do processo. Portanto, o GlobalAlloc e o LocalAlloc têm maior sobrecarga do que o HeapAlloc.

Como os diferentes alocadores de heap fornecem funcionalidades distintas ao usar mecanismos distintos, deve libertar memória com a função correta. Por exemplo, a memória alocada com HeapAlloc deve ser libertada com HeapFree e não com LocalFree ou GlobalFree. A memória alocada com GlobalAlloc ou LocalAlloc deve ser consultada, validada e libertada com a função global ou local correspondente.

A função VirtualAlloc permite-lhe especificar opções adicionais para a alocação de memória. No entanto, as suas alocações utilizam uma granularidade de página, pelo que usar o VirtualAlloc pode resultar num maior uso de memória.

A função Malloc tem a desvantagem de depender do tempo de execução. O novo operador tem a desvantagem de depender do compilador e da linguagem.

A função CoTaskMemAlloc tem a vantagem de funcionar bem em C, C++ ou Visual Basic. É também a única forma de partilhar memória numa aplicação baseada em COM, uma vez que o MIDL utiliza o CoTaskMemAlloc e o CoTaskMemFree para organizar a memória.

Examples

Funções globais e locais

Funções de heap

Funções de Memória Virtual