
Продолжу тему с TLSF аллокатором, о котором рассказала в предыдущем посте.Главная непонятная тема - как происходит процесс упаковки свободных блоков? 🤔 Расскажу об одном из алгоритмов (их несколько для TLSF).Если в общих чертах, то следующим образом:1️⃣ При освобождении блока помечаем его как свободный2️⃣ Пытаемся объединить с соседними свободными3️⃣ Если получилось, то переносим получившийся (более большой) блок в нужный FLI/SLIА что такое соседние свободные блоки? Тут под ними понимаются не блоки, которые лежат рядом в корзинке! Совсем нет! 🗣У каждого блока есть заголовок - это какая-то служебная (meta) информация. Часто там хранится размер блока, всякие флаги, индексы, и, указатели на соседние блоки. Когда мы делим большой блок на несколько маленьких (откусываем кусочек), то мы создаем двусвязный список, чтобы потом можно было этот кусочек вернуть обратно в большой пирог.А что такое двусвязный список? Это ссылки на соседей "слева" и "справа".Поэтому алгоритм упаковки достаточно простой:1️⃣ При освобождении блока помечаем его как свободный2️⃣ Смотрим на соседей, вдруг они тоже свободные3️⃣ Если свободные, то объединяем в более большой блок4️⃣ Удаляем объединенные блоки из корзин FLI/SLI, в которых они хранились5️⃣ Сохраняем новый большой блок в новую корзину FLI/SLIВуаля, упаковка произошла, дырок больше нет! ✨Весь алгоритм выполняется за O(1): проверка на свободный блок - через операции с битмаской, поиск соседей - через двусвязный список, операции удаления/вставки - опять же немного пошаманить с битмаской и сохранить в нужную корзину.Когда лучше всего использовать TLSF-аллокатор?🔘 Нужны блоки памяти достаточно большого размера с длинным жизненным циклом (всякие долгоживущие массивы, которые хранятся в памяти, например, все время жизни игры)🔘 Блоки разного размера🔘 Нужна поддержка возврата и переиспользования (обычная арена не подходит)В следующих постах расскажу о своей реализации аллокатора для вокселей: какой, почему именно такой, как я решила проблему с

