Это смелое утверждение, что программа C ++ "должна быть оснащена заменой malloc (например, tcmalloc) для проблем с производительностью ...."
"[In] 6 из 8 популярных эталонных тестов ... [приложения реального размера] заменяют пользовательский распределитель, в который люди вложили значительные суммы времени и денег, ... на предоставляемый системой тупой распределитель [уступил] лучшая производительность. ... Простые пользовательские распределители, настроенные для очень особых ситуаций, являются единственными, которые могут обеспечить выигрыш ". - Андрей Александреску
Большинство системных распределителей примерно такие же, как общего назначения . Вы можете сделать лучше только , если у вас очень специфическая схема распределения.
Как правило, такие специальные шаблоны применяются только к части программы, и в этом случае лучше применять пользовательский распределитель к определенной части, которая может выиграть, чем глобальная замена распределителя.
C ++ предоставляет несколько способов выборочной замены распределителя. Например, вы можете предоставить распределитель для контейнера STL или вы можете переопределить новый и удалить для каждого класса в отдельности. Оба из них дают вам гораздо лучший контроль, чем любой хак, который глобально заменяет распределитель.
Обратите внимание, что замена malloc и free не обязательно изменит распределитель, используемый операторами new и delete. Хотя глобальный новый оператор обычно реализуется с помощью malloc, требования к нему отсутствуют. Поэтому замена malloc может даже не повлиять на большинство выделений.
Если вы используете C, скорее всего, вы можете обернуть или заменить ключ malloc и бесплатные вызовы своим пользовательским распределителем именно там, где это важно, и оставить оставшуюся часть программы, чтобы использовать распределитель по умолчанию. (Если это не так, вы можете рассмотреть возможность рефакторинга.)
Системные распределители имеют десятилетия развития. Они стабильны и хорошо проверены. Они работают очень хорошо в общих случаях (с точки зрения необработанной скорости, конкуренции за потоки и фрагментации). У них есть отладочные версии для обнаружения утечек и поддержка инструментов отслеживания. Некоторые даже повышают безопасность вашего приложения, обеспечивая защиту от уязвимостей переполнения буфера динамической памяти. Скорее всего, библиотеки, которые вы хотите использовать, были протестированы только с системным распределителем.
Большинство методов замены системного распределителя лишены этих преимуществ. В некоторых случаях они могут даже увеличить потребность в памяти (поскольку они не могут использоваться совместно со средой выполнения DLL, возможно, используемой другими процессами). Они также имеют тенденцию быть чрезвычайно хрупкими перед лицом изменений в версии компилятора, времени выполнения и даже версии ОС. Использование измененной версии среды выполнения не позволяет вашим пользователям получать преимущества обновлений среды выполнения от поставщика ОС. Зачем отказываться от всего этого, если вы можете сохранить эти преимущества, применяя специальный распределитель только к той исключительной части программы, которая может извлечь из этого пользу?