Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Прочие языки программирования > Assembler
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 07.04.2013, 22:52
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию Подобие менеджера памяти

Каким образом проще реализовать хранилище указателей?
Проблема в том, что выделяется память в локальные переменные, а при завершении работы всего алгоритма она не прибивается (ибо по смыслу программа должна была завершиться забив на освобождение памяти).
Из-за этого подтекает память и алгоритм не совсем верно работает при втором проходе.

Кроме как сделать вектор или двусвязный список, чето в голову ничего не приходит (но под них тоже надо будет память (пере)выделять, а это лишние тормоза (если только чанками выделять)).
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию

Последний раз редактировалось M.A.D.M.A.N., 07.04.2013 в 22:56.
Ответить с цитированием
  #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.

Последний раз редактировалось Bargest, 07.04.2013 в 23:08.
Ответить с цитированием
  #3  
Старый 08.04.2013, 07:53
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Поторопился я с созданием темы.
В общем там память только выделяется, за прибиванием никто не отслеживает, так, что думаю простого выделения кусмана памяти и запись туда указателей на выделенную память будет вполне достаточно.
Потом просто в цикле идти и вызывать LocalFree со значениями из этого кусмана.

Спасибо за ответ, посмотрю хиппи.

Тогда еще такой вопрос, LocalReAlloc может выдать указатель, отличный от входного и при перевыделении скопирует ли он память? Чето в МСДН не нашел по этим двум вопросам информации. Ща в дельфи побалуюсь, может вопрос сам снимется.
Код:
  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  
Старый 08.04.2013, 12:06
Аватар для M.A.D.M.A.N.
M.A.D.M.A.N. M.A.D.M.A.N. вне форума
Sir Richard Abramson
 
Регистрация: 05.04.2008
Сообщения: 5,505
Версия Delphi: XE10
Репутация: выкл
По умолчанию

Из-за чего может выводиться:
Цитата:
Debug Output:
Invalid address specified to RtlFreeHeap( 01050000, 01070E68 )

Process test.exe (5088)
?

Вроде везде только LocalAlloc/LocalFree.
__________________
— Как тебя понимать?
— Понимать меня не обязательно. Обязательно меня любить и кормить вовремя.


На Delphi, увы, больше не программирую.
Рекомендуемая литература по программированию
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 19:43.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter