Malloc против пользовательского распределителя: Malloc имеет много накладных расходов. Почему?
У меня есть приложение для сжатия изображений, которое теперь имеет две разные версии систем выделения памяти. В первоначальном случае malloc используется везде, а во втором я реализовал простой пул-распределитель, который просто выделяет кусок памяти и возвращает части этой памяти вызовам myalloc ().
Мы заметили огромные накладные расходы памяти при использовании malloc: на пике использования кода памяти malloc () требует около 170 мегабайт памяти для образа 1920x1080x16bpp, тогда как распределитель пула выделяет только 48 мегабайт, из которых 47 используются программой.
С точки зрения шаблонов распределения памяти, программа выделяет много 8-байтовых (большинство), 32-байтовых (много) и 1080-байтовых блоков (некоторые) с тестовым изображением. Кроме этого, в коде нет динамического выделения памяти.
ОС системы тестирования - Windows 7 (64-разрядная).
Как мы тестировали использование памяти?
С помощью специального распределителя мы могли видеть, сколько памяти используется, потому что все вызовы malloc передаются распределителю. С помощью malloc () в режиме отладки мы просто пошагово просматривали код и наблюдали за использованием памяти в диспетчере задач. В режиме релиза мы сделали то же самое, но менее детально, потому что компилятор оптимизировал многие вещи, поэтому мы не могли пошагово проходить код (разница в размерах между выпуском и отладкой составляла около 20 МБ, что я бы приписал оптимизация и отсутствие отладочной информации в режиме релиза).
Может ли один только Маллок быть причиной таких огромных накладных расходов? Если так, что именно вызывает эти издержки внутри malloc?