HeapAlloc, GlobalAlloc, VirtualAlloc ??

Тема в разделе "WASM.WIN32", создана пользователем Magnum, 17 июл 2008.

  1. Magnum

    Magnum New Member

    Публикаций:
    0
    Регистрация:
    29 дек 2007
    Сообщения:
    925
    Объясните в деталях, в чем разница между этими функциями и какие когда юзать предпочтительнее?
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Я лично устал объяснять и в деталях и без деталей ;)
    Поюзай для начала поиск по форуму

    PS: (нескромный) поиск "HeapAlloc VirtualAlloc", автор "leo" выдает около десятка тем - мне в них ковыряться как-то лень ;)

    PPS: еще можешь глянуть коментарий к уроку Iczelion'а насчет отстойности GlobalAlloc c GMEM_MOVEABLE
     
  3. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    а MSDN почитать уже не вариант?
     
  4. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    вариант, только видимо у некоторых не только с поиском напряг, но и с аглицким ;)
     
  5. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    дык куда ж в кодинг без аглицкого)
    а то я уже видел шедевры вида OtkrytFail() :lol:
     
  6. jhons

    jhons New Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2007
    Сообщения:
    26
    как в англицком ... между heap, global и virtual ... и вся разница ... ГДЕ эта память будет формироватся.
     
  7. Twister

    Twister New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    720
    Адрес:
    Алматы
    jhons
    Не совсем верно. И HeapAlloc и GlobalAlloc выделяют память в куче, но
    А вот VirtualAlloc выделяет страницы прямо из адресного пространства процесса и заполняет их нулями. Соответственно размер выделяемой области будет всегда кратен размеру страницы.
     
  8. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Точнее сказать резервирует\занимает новый диапазон виртуальных адресов АПП. Затем при первом обращении к занятой (commited) странице вирт.памяти на чтение или запись под нее выделяется обнуленная страница ОЗУ и маппируется на вирт.адрес страницы в АПП. Т.е. VirtualAlloc всегда "откусывает" доп.диапазон адресов АПП и физ.память у системы, причем выделение новых страниц физ.памяти "по первому требованию" сопровождается существенными задержками, поэтому юзать VirtualAlloc без особой необходимости нецелесообразно.

    Кучу же можно сравнить с неким "салоном проката", который с помощью VirtualAlloc "за дорого покупает" у системы большие объемы АПП и физ.памяти и затем "за дешево" раздает их кусками во временное пользование. Поскольку в куче всегда есть собственный резерв адресов АПП и занятых страниц физ.памяти, то при запросе небольших блоков, как правило находится свободный участок в уже выделенных физ.страницах и соотв-но не требуется выделение доп.физ.памяти и само выделение происходит быстрее, чем при VirtualAlloc. Если среди выделенных страниц нет участка нужного размера, то менеджер кучи выделяет доп.страницы памяти через VirtualAlloc. Блоки более 512К в виндовом менеджере кучи всегда выделяются непосредственно через VirtualAlloc с занесением выделенного адреса в особый список.

    Поэтому HeapAlloc является преимущественным способом выделения памяти под "обычные" переменные и буферы. А за VirtualAlloc остаются спец.задачи, требующие установки особых атрибутов страниц или увеличения размера выделенного блока памяти в пределах заданного резерва адресов. Хотя конечно никто не запрещает использовать VirtualAlloc и для выделения "обычных" блоков памяти среднего\большого размера - просто нужно иметь в виду, что выделять менее 4К через VirtualAlloc просто бессмысленно, а выделение до 8-16К через HeapAlloc скорее всего будет значительно быстрее