Alocador customizado vs Malloc: Malloc tem muita sobrecarga. Por quê?
Eu tenho um aplicativo de compactação de imagem que agora tem duas versões diferentes de sistemas de alocação de memória. No original, malloc é usado em todos os lugares, e no segundo, eu implementei um simples alocador de pool, que apenas aloca um pedaço de memória e retorna partes daquela memória para chamadas myalloc ().
Temos notado uma sobrecarga de memória enorme quando malloc é usado: no auge de seu uso de memória, o código malloc () requer cerca de 170 megabytes de memória para uma imagem 1920x1080x16bpp, enquanto o alocador de pool aloca apenas 48 megabytes, dos quais 47 são utilizados pelo programa.
Em termos de padrões de alocação de memória, o programa aloca muitos blocos de 8 bytes (a maioria), 32 bytes (muitos) e 1080 bytes (alguns) com a imagem de teste. Além destes, não há alocações de memória dinâmicas no código.
O sistema operacional do sistema de teste é o Windows 7 (64 bits).
Como testamos o uso da memória?
Com o alocador personalizado, poderíamos ver quanta memória é usada, porque todas as chamadas de malloc são transferidas para o alocador. Com malloc (), no modo de depuração, apenas passamos pelo código e observamos o uso da memória no gerenciador de tarefas. No modo de lançamento, fizemos o mesmo, mas menos granulado, porque o compilador otimiza muitas coisas, então não poderíamos percorrer o código peça por peça (a diferença de memória entre release e debug era de cerca de 20MB, que eu atribui a otimização e falta de informações de depuração no modo de liberação).
Poderia malloc sozinho ser a causa de uma sobrecarga tão grande? Se sim, o que exatamente causa essa sobrecarga dentro do malloc?