Подскажите, пожалуйста, какую функцию лучше использовать для работы с памятью GlobalAlloc или HeapAlloc? Из описания я понял, что обе функции работают с кучами. Какие тогда существуют различия и под какие задачи какая из функций более подходит?
Собственно оттуда я и взял информацию по этим функциям. Про обе функции написано что они распределяют память заданного размера из кучи. Так же там имеется примечание, что желательнее использовать функции работы с кучами "heap functions". Но мне бы хотелось узнать какие-либо особенности от людей работавших с обоими видами функций.
tender_swallow Если кратко, то так. Если тебе нужно выделить память ОДИН РАЗ. То используй GlobalAlloc. Если ты ПОСТОЯННО выделяешь и освобождаешь память маленькими кусочками, тогда используй HeapCreate или GetProcessHeap, а затем можешь вызывать функции HeapAlloc и HeapFree. Это будет довольно эффективно. А если подробно, то GlobalAlloc в Windows является основной функцией для выделения памяти в пользовательском адресном пространстве. Если ты хочешь выделить кусок памяти под что либо, то от нее тебе никуда не деться. Для того чтобы тебе пользоваться функциями HeapAlloc и HeapFree тебе необходимо сначала вызвать функцию HeapCreate. Функция HeapCreate внутри себя все равно вызывает GlobalAlloc, с размером памяти, который ты указал в параметрах HeapCreate. И создается двусвязный список, который отвечает за разметку памяти внутри выделенного участка. Когда после этого ты выделяешь память с помощью HeapAlloc то система больше не переключается в режим ядра чтобы промапить кусок физической памяти в твое адресное пространство, а просто размечает заранее выделенную область, добавляя в двусвязный список новый индекс и быстро возвращает тебе результат.
по умолчанию одна куча для процесса выделяется. неа, Heap** как правило переходники к RtlHeap*, А конкретно RtlCreateHeap вызывает NtAllocateVirtualMemory. А вот GlobalAlloc вызывает RtlAllocateHeap.
Вот блин. Была же мысль протрассировать функции перед постом, чтоб не ошибиться. но лень было. Твоя правда.
leo Все ясно. До сегодняшнего момента я был уверен, что механизм памяти работает именно так как описал в посте. Оказалось с точностью до наоборот