Каково лучшее решение для замены нового распределителя памяти в существующем коде?
за последние несколько дней я получил некоторую информацию о распределителях памяти, отличных от стандартных malloc()
. Есть некоторые реализации, которые кажутся намного лучше, чем malloc()
для приложений с несколькими потоками. Например, кажется, что tcmalloc
и ptmalloc
иметь более высокую производительность.
у меня есть приложение на C++, которая использует как malloc
и new
операторы во многих местах. Я думал заменить их чем-то вроде ptmalloc
может улучшиться. Но мне интересно, как это new
оператор действует при использовании в приложении c++, которое работает на Linux? Использует ли он стандартное поведение malloc
или что-то еще?
каков наилучший способ заменить new
распределитель памяти со старым в коде? Есть ли способ переопределить поведение или new
и malloc
или мне нужно заменить все вызовы на них один за другим?
4 ответов
чтобы использовать 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, которая имеет аналогичный вид!