Быстрые делегаты C++ - Поддержка пользовательского распределителя памяти
ОГЛАВЛЕНИЕ
Поддержка пользовательского распределителя памяти
В новой версии наш делегат может использовать сервисы из любого пользовательского распределителя памяти, когда нужно выделить или освободить память для сохранения указателя функции-члена, размер которого больше размера внутреннего буфера, или для сохранения клонированного связанного объекта. std::allocator< void > использует память кучи, что является расточительным и очень медленным методом. Используя блок фиксированного размера (участок памяти), распределитель памяти может значительно повысить производительность для маленьких объектов по сравнению с использованием установленного по умолчанию std::allocator< void >. Конечно, степень выгоды от использования пользовательского распределителя будет изменяться в зависимости от деталей реализации используемого пользовательского распределителя.
Мы включили fd::util::fixed_allocator, который выделяет большой участок памяти сразу же для последующего использования маленькими объектами. Он был реализован на основе нескольких статей, найденных в CodeProject. Вы можете применять любой понравившийся вам пользовательский распределитель памяти.
Заключение
Если вас беспокоит только скорость, определите FD_DISABLE_CLONE_BOUND_OBJECT (дополнительные свободные 4 байта на делегат будут сэкономлены как бонус) и сохраните указатель на версию связанного объекта только функций-членов; иначе вы можете использовать интеллектуальный указатель на связанный объект и пользовательский распределитель памяти для настройки производительности путем нахождения равновесия между скоростью и надежностью. Поведение и функции делегата полностью настраиваются путем использования нужного макроса (смотрите файл "config.hpp").
Для тех, кто хочет увидеть детали реализации после макрорасширения, мы также включили руководство, описывающее, как извлечь упрощенную версию из полной версии.