Pergunta

Eu gostaria de saber qual o método é recomendado na programação do Windows C:. Usando malloc ou o Win32 HeapAlloc (? Talvez VirtualAlloc) função

Eu li as funções MSDN Gestão de memória artigo e os artigos do MSDN sobre malloc e HeapAlloc, mas eles não dizem qual delas deve ser usada e em que situações.

Foi útil?

Solução

Stick with malloc menos que você tenha uma razão para usar algo diferente. Será implementada por baixo em termos de primitivas de alocação de memória do sistema operacional, mas não há nenhuma vantagem real em mergulho para baixo para que a camada de si mesmo.

Alguns API chama Acredito que precisamos de um bloco de memória alocada a partir de uma pilha de Windows, mas você vai saber quando você se deparar com eles.

Ou se você quer fazer algo mais avançado, como o uso compartilhado de memória, ou necessidade de controlar as permissões nas páginas de memória diretamente, então você vai precisar de olhar para as chamadas de API do Windows como VirtualAlloc.

Outras dicas

VirtualAlloc e os amigos podem dar-lhe um pouco de uma vantagem se você tem montes de dados para processo ou se você precisa ir para a dificuldade de criar seu próprio gerenciador de memória de qualquer maneira.

Caso contrário, é mais fácil e, claro, mais portátil para malloc uso apenas ().

VirtualAlloc tem esse recurso bacana chamado MEM_RESET, o que invalida os dados em um bloco de memória, mas mantém alocado. Isto significa que se é paginada para disco, o Windows não vai incomodar a página lo de volta na próxima vez que você acessá-lo. É bom se você tiver muitos megas de dados que podem de repente se tornam desnecessário, mas em breve você vai ter outra coisa para preencher o buffer-se.

Ele também diferencia entre reservando espaço de endereço e realmente solicitando memória. Há algumas coisas agradáveis ??lá, se você tem uma boa razão para ir para todos os problemas.

Mais uma coisa:. Malloc () é garantido para ser portátil (pelo menos para qualquer implementação de ANSI-C) e mais elegante

Em algumas situações, usando funções como HeapAlloc, HeapFree irá tornar sua vida mais fácil. Um exemplo seria: um grande aplicação onde você precisa alocar memória em um módulo (dizer em Library1.dll) e libertar essa memória no módulo principal (program.exe digamos). Isso pode ser feito com segurança se você estiver usando funções HeapAlloc, HeapResize e HeapFree, mas não pode ser feito usando a biblioteca C runtime (por exemplo, malloc, livre, redimensionamento).

Mas: Se você não tem uma boa razão, você deve ficar com funções malloc / livre / redimensionamento. Além disso, se você precisa mudar permisions da memória alocada. (Por exemplo: fazer com que se executável, etc), você deve usar funções como VirtualAlloc, VirtualFree

Você poderia fazer um invólucro e deixar a opção de alterar os detalhes de implementação. Você poderia até mesmo comparar as duas opções com o seu código e depois decidir.

Ao contrário de Rob, que eu vá para o outro lado ... Desde que eu escolhi para código contra o WinAPI, eu uso as funções nativas em vez de C queridos em tempo de execução, que são apenas um wrapper fino ao redor deles de qualquer maneira.

Com HeapAlloc você pode ter pilhas separadas para diferentes tarefas / subsistemas. Isso pode simplificar a análise despejo de grandes aplicações.

Com malloc você só pode usar um monte, mas você começa algumas otimizações de alocação que CRT autores podem ter implementado em cima do OS HeapAlloc.

Indo para VirtualAlloc não comprar-lhe muito, a menos que você deseja implementar gerente de costume pilha (o seu próprio conjunto de Heap * funções).

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top