|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
Подобие менеджера памяти
Каким образом проще реализовать хранилище указателей?
Проблема в том, что выделяется память в локальные переменные, а при завершении работы всего алгоритма она не прибивается (ибо по смыслу программа должна была завершиться забив на освобождение памяти). Из-за этого подтекает память и алгоритм не совсем верно работает при втором проходе. Кроме как сделать вектор или двусвязный список, чето в голову ничего не приходит (но под них тоже надо будет память (пере)выделять, а это лишние тормоза (если только чанками выделять)). — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 07.04.2013 в 22:56. |
#2
|
||||
|
||||
Самое простое, имхо - сделать таблицу, вида
<адрес><размер><флаги>|<адрес><размер><флаги>|<адр ес><размер><флаги>|<адрес><размер><флаги>... Во флагах будет обозначено, занят фрагмент или свободен. При выделении - ищем либо свободный блок равного размера и его занимаем, либо отрезаем кусок от большего блока и помечаем как занятый. При освобождении - ставим флаг "свободно" и сливаем с соседними свободными. Таблица относительно небольшая, и при этом может описывать довольно много блоков. При этом происходит много копирований этой таблицы, но зато просто в реализации. Разумеется, когда таблица кончится - придется выделять новое место для нее. Где-то год или полтора назад я упоролся и сделал такой менеджер на асм. Пока вроде работает. Хотя конечно, никакой оптимизацией тут и не пахнет. Еще вариант - нарыл в инете простенький менеджер heappie. Он пошустрее будет наверно, но он на плюсах и в его код я особо не вникал. В любом случае, принцип менеджера примерно одинаков всегда. И в том, и в другом случае, от оси выделяется большой кусок, потом работаем внутри него. Не знаю как в хиппи, а в моем алгоритме можно запросто пройтись по таблице и освободить всё нафиг. З.Ы. если надо просто хранить указатели - то проще всего сделать вектор и битовую маску к нему. Стерли - сняли бит, при поиске смотрим свободное место для записи или дописываем в конец. Выделяем сразу много и перевыделять скорее всего не придется. jmp $ ; Happy End! The Cake Is A Lie. Последний раз редактировалось Bargest, 07.04.2013 в 23:08. |
#3
|
||||
|
||||
Поторопился я с созданием темы.
В общем там память только выделяется, за прибиванием никто не отслеживает, так, что думаю простого выделения кусмана памяти и запись туда указателей на выделенную память будет вполне достаточно. Потом просто в цикле идти и вызывать LocalFree со значениями из этого кусмана. Спасибо за ответ, посмотрю хиппи. Код:
foo: Cardinal; begin foo := LocalAlloc(LMEM_ZEROINIT, 1024); lstrcpyA(PAnsiChar(foo), 'qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq'); foo := LocalReAlloc(foo, 2048, LMEM_MOVEABLE); — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 08.04.2013 в 08:54. |
#4
|
||||
|
||||
Из-за чего может выводиться:
Цитата:
Вроде везде только LocalAlloc/LocalFree. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |