Предпосылка («распределители памяти используют циклически связанный список для хранения выделенных / свободных адресов») не всегда верны.Это может быть верно для некоторых распределителей, но это не так в целом.
Если распределитель использует структуру, похожую на связанный список, для отслеживания блоков памяти, он часто внедряется как метаданные в блоки памятисами - т.е.не как отдельная структура данных на стороне.
Например, каждый блок памяти может начинаться со статуса (свободно / выделено) и размера блока.Этот подход в основном реализует связанный список (используя размер, вы можете легко определить начальный адрес следующего блока), но у него есть другие свойства, которых нет у связанного списка: вы все равно можете найти определенный блок памяти (узел)зная его адрес в памяти.
Итак, у вас будет время доступа O (1) (потому что вы или компилятор знаете адрес памяти блока памяти).Слияние соседних свободных блоков также просто.Если необходимо запустить какой-либо алгоритм де-фрагментации или сжатия, это можно сделать с помощью структуры, похожей на связанный список.Найти свободный блок достаточного размера можно также с помощью структуры, похожей на связанный список (хотя иногда второй встроенный связанный список используется специально для свободных блоков, чтобы минимизировать накладные расходы на функции выделения).
OfКонечно, это только один из возможных подходов к проблеме.Но это говорит о том, что использование связанного списка не обязательно является худшим выбором, чем другая структура данных.