· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Подсобите с VirtualAlloc

Посл.отвђт Сообщенiе


Дата: Окт 22, 2004 14:32:39

Извиняюсь если спрашиваю очевидные вещи, но:
вызываю с MEM_RESERVE на дофига памяти, после прога узнает сколько ей реально требуется и - MEM_COMMIT сколько надо. Вопрос: как сократить НЕПРЕРЫВНОЕ ЗАРЕЗЕРВИРОВАННОЕ пространство?


Дата: Окт 22, 2004 14:42:04 · Поправил: NoName

VirtualFree


Дата: Окт 22, 2004 18:13:17

Етить, похоже не понятно написал.
У Free два флага: MEM_DECOMMIT и MEM_RELEASE. DECOMMIT освобождает выделенную память. RELEASE освобождает ВСЁ пространство адресов. Мне надо УМЕНЬШИТЬ пространство адресов до необходимых размеров, например было 512МБ, а стало 10КБ - не выделенной памяти, а непрерывного адресного пространства.


Дата: Окт 23, 2004 04:20:34

IMHO можно вообще не сокращать НЕПРЕРЫВНОЕ ЗАРЕЗЕРВИРОВАННОЕ пространство:
- если далее нет XXXAlloc, то всё ОК.
- если далее есть XXXAlloc, то всёравно прога должна учитывать вариант, когда вся MEM_RESERVE будет сделана MEM_COMMIT, инече зачем так много MEM_RESERVE?


Дата: Окт 23, 2004 10:29:07 · Поправил: LocTb

Резон: делаю VirtualAllocEx (512MB) MEM_RESERVE в WarCraftIII, гружу следующую миссию - варчик вылетает.


Дата: Окт 23, 2004 10:50:39 · Поправил: leo

LocTb
>"как сократить НЕПРЕРЫВНОЕ ЗАРЕЗЕРВИРОВАННОЕ пространство?"
>"RELEASE освобождает ВСЁ пространство адресов."
Поэтому никак.
S_T_A_S_ уже ответил, что можно ничего не сокращать, т.к. зарезервированное пространство "каши не просит" и раз ты его выделил, то наверное не от балды, а в расчете на то что оно может заполнится. Вот и рассчитывай дальнейшую логику из того что оно заполнено.

А общих подходов может быть несколько. Самый простой это тот о котором ты говоришь. Прикинули сколько максимум может понадобиться и зарезервировали один раз. Если пожадничал и оказалось нужно больше, то либо выдавай exception, либо резервируй новый увеличенный блок и переписывай все в него. Если и пространство сэкономить хочется и не переписывать данные, тогда переходим к резервированию блоками, например по 1Мб (минимум 64 кБ, но уж никак не 10). Здесь опять два случая. Если больше никаких явных или скрытых аллоков не делается, то в итоге все блоки образуют один непрерывный массив. Поэтому с данными можно работать как обычно, а усложняется только управление выделением и освобожденим блоков памяти. Если же между твоими блоками данных, может втиснуться "посторонний", то придется усложнять и управление памятью и данными, т.е. если с ними нужно работать как с массивом или стримом, то придется учитывать переходы адресов между блоками.


Дата: Окт 23, 2004 11:39:06

leo
Большое спасибо, а то уж стал думать что с ума схожу- именно такие мысли и приходили в голову. Просто думал есть аналогия Realloc для резервирования. Остановился на таком методе- резервирую дофига, после выделив сколько надо- резервирую и выделяю в новом месте и копирую туда данные, старый большой блок - RELEASE. Если есть лучшие идеи -поделитесь пожалуйста.


Дата: Окт 24, 2004 10:20:42 · Поправил: leo

LocTb
> "Если есть лучшие идеи - поделитесь пожалуйста"
Чтобы были идеи нужно уточнить задачу. Из слов "гружу следующую миссию" можно сделать вывод, что тебе нужно последовательно выделять несколько блоков памяти заранее неизвестных размеров. Но тогда вопрос: а почему для каждого блока нужно делать отдельный резерв. Почему нельзя писать все блоки в одно пространство: делаешь один большой резерв, а затем только commit.
И еще не совсем понятно как происходит загрузка и почему размер становится известным только в конце.


Дата: Окт 25, 2004 08:21:28 · Поправил: LocTb

leo
Да нет, я имел ввиду вот что: зарезервировав много памяти, я в игре жму "продолжить", и после трещания винта у меня stack overflow.
С проблемой- разобрался, я просто поприбивал у некоторых страниц PAGE_GUARDE.
>"Почему нельзя писать все блоки в одно пространство: делаешь один большой резерв, а затем только commit"
Именно так и делаю.
>"И еще не совсем понятно как происходит загрузка и почему размер становится известным только в конце"
Написал прогу типа ArtMoney, оптимизированную для XP/2003- вот по-этому и не знаю сколько надо вначале памяти.
PS.: Хоть и всё работает, но теперь вначале резерв = 64МБ:)


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.088