Я лично устал объяснять и в деталях и без деталей Поюзай для начала поиск по форуму PS: (нескромный) поиск "HeapAlloc VirtualAlloc", автор "leo" выдает около десятка тем - мне в них ковыряться как-то лень PPS: еще можешь глянуть коментарий к уроку Iczelion'а насчет отстойности GlobalAlloc c GMEM_MOVEABLE
как в англицком ... между heap, global и virtual ... и вся разница ... ГДЕ эта память будет формироватся.
jhons Не совсем верно. И HeapAlloc и GlobalAlloc выделяют память в куче, но А вот VirtualAlloc выделяет страницы прямо из адресного пространства процесса и заполняет их нулями. Соответственно размер выделяемой области будет всегда кратен размеру страницы.
Точнее сказать резервирует\занимает новый диапазон виртуальных адресов АПП. Затем при первом обращении к занятой (commited) странице вирт.памяти на чтение или запись под нее выделяется обнуленная страница ОЗУ и маппируется на вирт.адрес страницы в АПП. Т.е. VirtualAlloc всегда "откусывает" доп.диапазон адресов АПП и физ.память у системы, причем выделение новых страниц физ.памяти "по первому требованию" сопровождается существенными задержками, поэтому юзать VirtualAlloc без особой необходимости нецелесообразно. Кучу же можно сравнить с неким "салоном проката", который с помощью VirtualAlloc "за дорого покупает" у системы большие объемы АПП и физ.памяти и затем "за дешево" раздает их кусками во временное пользование. Поскольку в куче всегда есть собственный резерв адресов АПП и занятых страниц физ.памяти, то при запросе небольших блоков, как правило находится свободный участок в уже выделенных физ.страницах и соотв-но не требуется выделение доп.физ.памяти и само выделение происходит быстрее, чем при VirtualAlloc. Если среди выделенных страниц нет участка нужного размера, то менеджер кучи выделяет доп.страницы памяти через VirtualAlloc. Блоки более 512К в виндовом менеджере кучи всегда выделяются непосредственно через VirtualAlloc с занесением выделенного адреса в особый список. Поэтому HeapAlloc является преимущественным способом выделения памяти под "обычные" переменные и буферы. А за VirtualAlloc остаются спец.задачи, требующие установки особых атрибутов страниц или увеличения размера выделенного блока памяти в пределах заданного резерва адресов. Хотя конечно никто не запрещает использовать VirtualAlloc и для выделения "обычных" блоков памяти среднего\большого размера - просто нужно иметь в виду, что выделять менее 4К через VirtualAlloc просто бессмысленно, а выделение до 8-16К через HeapAlloc скорее всего будет значительно быстрее