Каково лучшее решение для замены нового распределителя памяти в существующем коде?

за последние несколько дней я получил некоторую информацию о распределителях памяти, отличных от стандартных malloc(). Есть некоторые реализации, которые кажутся намного лучше, чем malloc() для приложений с несколькими потоками. Например, кажется, что tcmalloc и ptmalloc иметь более высокую производительность.

у меня есть приложение на C++, которая использует как malloc и new операторы во многих местах. Я думал заменить их чем-то вроде ptmalloc может улучшиться. Но мне интересно, как это new оператор действует при использовании в приложении c++, которое работает на Linux? Использует ли он стандартное поведение malloc или что-то еще?

каков наилучший способ заменить new распределитель памяти со старым в коде? Есть ли способ переопределить поведение или new и malloc или мне нужно заменить все вызовы на них один за другим?

4 ответов


С документация TCMalloc:

чтобы использовать TCmalloc, просто свяжите tcmalloc в свое приложение с помощью флага компоновщика "- ltcmalloc". Вы можете использовать tcmalloc в приложениях, которые вы не скомпилировали самостоятельно, используя LD_PRELOAD:

$ LD_PRELOAD= " /usr/lib / libtcmalloc.Итак"

ptmalloc кажется похожим (но если вы находитесь в Linux, вы, вероятно, уже используете его потому что это часть GNU C библиотека).

Я бы ожидал operator new называть malloc, но вы можете легко проверить на себе, установив точку останова на malloc, затем вызов new. Если new не называет malloc, вы можете изменить его так, что он делает.


Если ваша программа многопоточна, то клад распределитель высоко ценится. Я лично не думаю, что стоит беспокоиться о Linux, хотя, поскольку ptmalloc glibc уже довольно хорош.


Я думаю, что чрезмерная езда определенно возможна. Вы можете просто связать свою applciation с новой библиотекой реализации, которую вы хотите, и все вызовы new, malloc будут переопределены. Я этого не делал. Но я предполагаю, что это возможно, потому что при использовании valgrind он использует свои собственные распределители памяти для отслеживания статистики использования памяти приложения и в конце концов дает результат. Так что, если это возможно, определенно должен быть способ.

проверить это ссылке. Он содержит информация о библиотеке smartheap, которая имеет аналогичный вид!


сколько времени ваше приложение тратит на выделение памяти?