TCMalloc — аллокатор динамической памяти для C и C++, альтернативный стандартной реализации malloc/new. Он использует кэши и размерные классы для быстрых частых операций. Современный Google TCMalloc поддерживает per-CPU и legacy per-thread режимы; его не следует смешивать с веткой gperftools. Это не сборщик мусора, а выигрыш зависит от нагрузки.
Что такое TCMalloc?
Как TCMalloc ускоряет частые выделения памяти с помощью кэшей и размерных классов, чем отличаются per-CPU и per-thread режимы и почему выигрыш нужно измерять.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
TCMalloc — реализация выделения и освобождения динамической памяти для C и C++, используемая вместо соответствующего стандартного аллокатора. Она обслуживает операции семейства malloc/free и new/delete. Это не сборщик мусора: время жизни объектов и корректное освобождение памяти остаются ответственностью программы.
Основная идея — удовлетворять многие небольшие запросы из близкого к исполнению кэша, уменьшая обращения к общим структурам и конкуренцию за блокировки. Размеры небольших объектов группируются в размерные классы; при нехватке свободных блоков кэш пополняется через следующие уровни аллокатора. Такая схема описана в дизайне Google TCMalloc.
Название исторически расшифровывается как Thread-Caching Malloc, но современную реализацию нельзя описывать только как кэш на поток. Google TCMalloc поддерживает per-CPU режим, где кэш связан с логическим CPU, и legacy per-thread режим. Выбор зависит от поддерживаемого окружения; обзор приведен в официальной документации.
Также различайте современный google/tcmalloc и TCMalloc в составе gperftools. Это разные линии развития общего предшественника, что отдельно отмечает документация gperftools. Их возможности и способы подключения нельзя переносить друг на друга без проверки.
Утверждать, что TCMalloc всегда быстрее или всегда расходует меньше памяти, неправильно. Результат зависит от размеров объектов, числа потоков, характера освобождений и платформы. Нужно сравнивать задержки, пропускную способность и фактическое потребление памяти на характерной нагрузке. Кэширование освобожденных блоков также означает, что вызов free не обязан немедленно уменьшить память, занятую процессом у ОС.