Подсобите с VirtualAlloc

Тема в разделе "WASM.WIN32", создана пользователем LocTb, 22 окт 2004.

  1. LocTb

    LocTb New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    54
    Извиняюсь если спрашиваю очевидные вещи, но:

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

    NoName New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2004
    Сообщения:
    1.229
    VirtualFree
     
  3. LocTb

    LocTb New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    54
    Етить, похоже не понятно написал.

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

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    IMHO можно вообще не сокращать НЕПРЕРЫВНОЕ ЗАРЕЗЕРВИРОВАННОЕ пространство:

    - если далее нет XXXAlloc, то всё ОК.

    - если далее есть XXXAlloc, то всёравно прога должна учитывать вариант, когда вся MEM_RESERVE будет сделана MEM_COMMIT, инече зачем так много MEM_RESERVE?
     
  5. LocTb

    LocTb New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    54
    Резон: делаю VirtualAllocEx (512MB) MEM_RESERVE в WarCraftIII, гружу следующую миссию - варчик вылетает.
     
  6. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    LocTb

    >"как сократить НЕПРЕРЫВНОЕ ЗАРЕЗЕРВИРОВАННОЕ пространство?"

    >"RELEASE освобождает ВСЁ пространство адресов."

    Поэтому никак.

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



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

    LocTb New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    54
    leo

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

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    LocTb

    > "Если есть лучшие идеи - поделитесь пожалуйста"

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

    И еще не совсем понятно как происходит загрузка и почему размер становится известным только в конце.
     
  9. LocTb

    LocTb New Member

    Публикаций:
    0
    Регистрация:
    11 окт 2004
    Сообщения:
    54
    leo

    Да нет, я имел ввиду вот что: зарезервировав много памяти, я в игре жму "продолжить", и после трещания винта у меня stack overflow.

    С проблемой- разобрался, я просто поприбивал у некоторых страниц PAGE_GUARDE.

    >"Почему нельзя писать все блоки в одно пространство: делаешь один большой резерв, а затем только commit"

    Именно так и делаю.

    >"И еще не совсем понятно как происходит загрузка и почему размер становится известным только в конце"

    Написал прогу типа ArtMoney, оптимизированную для XP/2003- вот по-этому и не знаю сколько надо вначале памяти.

    PS.: Хоть и всё работает, но теперь вначале резерв = 64МБ:)