Комментарии 7
Вы бы репозиторий с примером открыли, а то ссылка есть, а репозиторий не доступен
return (top_ = *static_cast<void**>(node)), node;
(*static_cast<void**>(node) = top_), top_ = node;
return (s_cursor = c1), c;
Не хотелось бы мне сопровождать код написанный в таком стиле.
Привет )
Это классический паттерн однонаправленного списка в аллокаторах через void**.
Не всегда под единственное первое слово блока памяти декларируют аж тип, тем более, что это тоже не совсем корректно, делать простой reinterpret_cast<> к некоему BlockHeader - формально это UB, поэтому уровень "почти асма" именно в этой точке не напрягает (приведение к void** автоматически отсекает рассуждения насчёт "подержки прикладными программистами").
Если уж включать пуризм, то требуется обкладывать через start_lifetime_as из С++23, но я не был уверен, во что это выльется, а тут заведомо знаю во что - паттерн типовой.
Надо будет поэкспериментировать на различных компиляторах, как дойдут руки...
Я не про работу с void*, а про использование оператора запятая для минимизации количества строк кода.
Размеры пулов по степеням двойки – это, возможно, хорошо для скорости. Но при большом количестве одновременно живущих небольших объектов такая политика ведет к заметному перерасходу памяти.

WXL: как создавать объекты в 15 раз быстрее