Malloc vs asignador personalizado: Malloc tiene muchos gastos generales. ¿Por qué?
Tengo una aplicación de compresión de imágenes que ahora tiene dos versiones diferentes de sistemas de asignación de memoria. En el original, malloc se usa en todas partes, y en el segundo, implementé un simple agrupador de asignaciones, que solo asigna una parte de la memoria y devuelve partes de esa memoria a las llamadas a myalloc ().
Hemos notado una gran sobrecarga de memoria cuando se utiliza malloc: en el momento de mayor uso de la memoria, el código de malloc () requiere unos 170 megabytes de memoria para una imagen de 1920x1080x16bpp, mientras que el asignador de grupo asigna solo 48 megabytes, de los cuales 47 son utilizados por el programa.
En términos de patrones de asignación de memoria, el programa asigna una gran cantidad de bloques de 8 bytes (la mayoría), de 32 bytes (muchos) y de 1080 bytes (algunos) con la imagen de prueba. Aparte de estos, no hay asignaciones de memoria dinámica en el código.
El sistema operativo del sistema de prueba es Windows 7 (64 Bit).
¿Cómo probamos el uso de la memoria?
Con el asignador personalizado, podríamos ver cuánta memoria se usa porque todas las llamadas a malloc se transfieren al asignador. Con malloc (), en el modo de depuración, simplemente pasamos por el código y observamos el uso de la memoria en el administrador de tareas. En el modo de publicación hicimos lo mismo, pero con menos detalles porque el compilador optimiza muchas cosas, por lo que no pudimos avanzar paso a paso el código pieza por pieza (la diferencia de memoria entre la versión y la depuración era de unos 20 MB, que atribuiría a optimización y falta de información de depuración en el modo de lanzamiento).
¿Podría Malloc solo ser la causa de una sobrecarga tan grande? Si es así, ¿qué causa exactamente esta sobrecarga dentro de malloc?