Реализация распределителя «раздражающего аллигатора» Александреску?

На прошлогоднем CppCon замечательный Андрей Александреску выступил с докладом о разработке распределителей памяти, (в?) подходящим названием:

std::allocator — это то же самое, что std::vector для Vexation.

(более ранние заголовки: «std::allocator для распределения — это то же самое, что allegator для утверждения» или «написание распределителей, которые не работают»).

Теперь я ищу не копию его кода, а что-то основанное на нем, которое:

  • Имеет правильную/лучшую поддержку выравнивания (надеюсь, через параметры шаблона, возможно, даже включая выравнивание в Blkструктуре?).
  • Включает более богатый набор известных алгоритмов распределения
  • Используется более чем двумя людьми :-)

Есть ли такая вещь там?

Ответы (1)

Да, есть: Феликс Петрикони

Библиотека Allocator Builder (GitHub)

Цитата из описания репозитория:

Распределитель C++ с широкими возможностями компоновки, основанный на политике.

Идея компоновки библиотеки была представлена ​​Андреем Александреску на семинаре C++ and Beyond 2013 и CppCon 2015 .

Так что именно то, что просил ОП. Дополнительная общая информация:

Компонуемые распределители, предоставленные по состоянию на март 2017 года:

  • affix_allocator : позволяет автоматически пре- и суффиксировать выделенные регионы.
  • allocator_with_stats : Распределитель, который собирает настроенное количество статистической информации, такой как количество выделенных байтов, количество успешных расширений и прилив.
  • Bucketizer : управляет кучей аллокаторов с увеличением размера корзины.
  • fallback_allocator : Либо распределитель по умолчанию может обработать запрос, либо он передается резервному распределителю.
  • (aligned_)mallocator : Предоставляет интерфейс к системам ::malloc(), выровненный вариант выделяет ресурсы в соответствии с заданным выравниванием. null_allocator Распределитель Null
  • сегрегатор : разделяет запросы на выделение в зависимости от порога для распределителя A или B.
  • (shared_)freelist : Управляет списком освобожденных блоков памяти в списке для более быстрого повторного использования. (Вариант Shared является потокобезопасным)
  • (shared_)cascading_allocator : Управляет потокобезопасным распределителем и автоматически создает новый, когда предыдущий не хватает памяти. (Вариант Shared является потокобезопасным, но требует дальнейших улучшений, поскольку не освобождает неиспользуемые распределители)
  • (shared_)heap : куча на основе блоков кучи. (Вариант Shared является потокобезопасным с минимальными накладными расходами и, насколько это возможно, без блокировок.)
  • stack_allocator : Обеспечивает доступ к памяти, взятой из стека

Так что это прочная основа для начала. Много «звезд» GitHub и последователей.