Не зная больше, невозможно дать вам хороший ответ, но да, управление собственной памятью (часто путем выделения большого блока, а затем выполнения собственных выделений в этом большом блоке) может избежать высокой стоимости, связанной с общим назначением диспетчеры памяти. Например, в Windows много небольших распределений поставят производительность на колени. Существующие реализации существуют почти для каждого типа менеджера памяти, но я не уверен, какой именно тип вы запрашиваете ...
При программировании в Windows, я считаю, что вызов malloc / free - это смерть для производительности - почти любое выделение памяти в приложении, которое амортизирует распределение памяти путем пакетной обработки, сэкономит вам ресурсы процессора при распределении / освобождении, поэтому это может быть не так так важно, какой подход вы используете, если вы не вызываете распределитель по умолчанию.
Как говорится, вот несколько упрощенных многопоточных наивных идей:
Этот не является строго диспетчером слябов, но, похоже, обеспечивает хороший баланс и обычно используется.
Я лично обнаружил, что часто заканчиваю тем, что использую довольно простой в реализации менеджер повторного использования памяти для блоков памяти одинакового размера - он поддерживает связанный список неиспользуемой памяти фиксированного размера и выделяет новый блок памяти когда это нужно. Хитрость заключается в том, чтобы хранить указатели для связанного списка в неиспользуемых блоках памяти - таким образом, существует очень маленькая служебная нагрузка в четыре байта. Весь процесс равен O (1) всякий раз, когда он повторно использует память. Когда ему нужно выделить память, он вызывает распределитель плит (что само по себе тривиально).
Для чистого распределителя только для выделения вы просто просите систему (приятно) выделить вам большой кусок памяти и отследить, какое пространство вы еще не использовали (просто сохранить указатель на начало неиспользованного площадь и указатель на конец). Если у вас недостаточно места для размещения запрошенного размера, выделите новую плиту. (Для больших кусков просто перейдите к распределителю системы.)
Проблема с цепочкой этих подходов? Ваше приложение никогда не освободит память, но приложения, критичные к производительности, часто являются либо приложениями для однократной обработки, либо создают множество объектов одинакового размера, а затем прекращают их использование.
Если вы осторожны, приведенный выше подход не слишком сложен, чтобы сделать многопоточную дружественной, даже с помощью атомарных операций.