Сначала решите, какие «кратные» вы хотите использовать для выделенных блоков памяти. Я обычно использую 8 байтов.
При запуске приложения создайте вектор, в котором каждый элемент в векторе указывает на «пул» кусков памяти. Первый индекс в векторе будет для выделения памяти 8 байтов или меньше. Второй индекс в векторе будет для выделения памяти из 9-16 байтов и т. Д.
Внутри каждого пула выделяйте память большими кусками. Например. в пуле для выделения 8 байтов (или меньше) не выделяйте 8 байтов, но выделяйте N раз 8 байтов. В пуле запомните, какие части действительно выделены в приложении, а какие просто ожидают выделения.
При освобождении памяти не освобождайте ее немедленно, но держите некоторые куски готовыми к следующему выделению этого размера.
Только если у вас много последующих свободных чанков, верните свободную память операционной системе.
Это основная идея. Остальное реализует пулы (обычно связанные списки чанков).
Сложная часть - интеграция реализации кучи в приложение.
- Если вы все еще используете malloc / free, используйте # define для переопределения malloc и free
- Если вы используете new / delete, задайте глобальные операторы new и delete
Также взгляните на Как решить проблему фрагментации памяти и мой комментарий на Управление памятью в приложении с интенсивным использованием памяти