Показать сообщение отдельно
  #2  
Старый 07.04.2013, 23:05
Аватар для Bargest
Bargest Bargest вне форума
Профессионал
 
Регистрация: 19.10.2010
Адрес: Москва
Сообщения: 2,390
Версия Delphi: XE3/VS12/FASM
Репутация: 14665
По умолчанию

Самое простое, имхо - сделать таблицу, вида
<адрес><размер><флаги>|<адрес><размер><флаги>|<адр ес><размер><флаги>|<адрес><размер><флаги>...
Во флагах будет обозначено, занят фрагмент или свободен. При выделении - ищем либо свободный блок равного размера и его занимаем, либо отрезаем кусок от большего блока и помечаем как занятый. При освобождении - ставим флаг "свободно" и сливаем с соседними свободными. Таблица относительно небольшая, и при этом может описывать довольно много блоков. При этом происходит много копирований этой таблицы, но зато просто в реализации.
Разумеется, когда таблица кончится - придется выделять новое место для нее.
Где-то год или полтора назад я упоролся и сделал такой менеджер на асм. Пока вроде работает. Хотя конечно, никакой оптимизацией тут и не пахнет.
Еще вариант - нарыл в инете простенький менеджер heappie. Он пошустрее будет наверно, но он на плюсах и в его код я особо не вникал.
В любом случае, принцип менеджера примерно одинаков всегда.

И в том, и в другом случае, от оси выделяется большой кусок, потом работаем внутри него. Не знаю как в хиппи, а в моем алгоритме можно запросто пройтись по таблице и освободить всё нафиг.

З.Ы. если надо просто хранить указатели - то проще всего сделать вектор и битовую маску к нему. Стерли - сняли бит, при поиске смотрим свободное место для записи или дописываем в конец. Выделяем сразу много и перевыделять скорее всего не придется.
__________________
jmp $ ; Happy End!
The Cake Is A Lie.
Ответить с цитированием