Один вопрос, конечно, почему вы так беспокоитесь?
Вы говорите, что хотите избежать накладных расходов new
, но почему бы вместо этого не выбрать лучшую реализацию new
?tcmalloc
и jemalloc
, как правило, являются очень хорошими претендентами для многопоточных приложений, например.
То, что вы пытаетесь создать, на самом деле очень похоже на написание настраиваемого malloc
/ new
реализация.Поэтому вы, если вы действительно не хотите использовать проверенную реализацию, извлекли бы пользу из идей тех, кто это сделал.
Мой личный интерес связан со стратегией BiBOP (Big Bag of Pages) для борьбы с фрагментацией.Идея состоит в том, чтобы иметь выделенный пул на размер распределения, и, таким образом, достаточно простого свободного списка (чередующегося с распределениями) (слияние не требуется).Обычно это делается до тех пор, пока запрошенный размер меньше размера страницы (я видел использование 4 КБ), а все, что больше, выделяется само по себе (на нескольких страницах).Отброшенные страницы перерабатываются.
Основной интерес, который у меня есть, заключается в том, что с BiBOP легко поддерживать диапазон адресов дерева интервалов -> заголовок страницы, таким образом определяя полный размер объекта по адресу (возможно)внутренний элемент (например, атрибут), который полезен для сборки мусора (см. следующий шаг).
Для многопоточного размещения tcmalloc
и jemalloc
используют два разных подхода:
jemalloc
использовать пул для каждого потока: хорошо с фиксированным числом потоков / пулов потоков, но сделать процесс создания потока более дорогостоящим tcmalloc
использовать глобальный многопоточный пул,с технологией без блокировок, и попытайтесь сбалансировать нагрузку на потоки в доступных пулах, чтобы ограничить конкуренцию, заставляя поток искать новый пул, если тот, который он использует, «заблокирован» (а не ожидает), и каждый поток кэшируетпоследний использованный пул в локальной переменной потока.Потоки поэтому легковесны, но могут возникнуть некоторые споры, если число пулов слишком мало по сравнению с количеством активных потоков.