Работа с памятью

Тема в разделе "WASM.WIN32", создана пользователем tender_swallow, 21 июн 2007.

  1. tender_swallow

    tender_swallow New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    45
    Подскажите, пожалуйста, какую функцию лучше использовать для работы с памятью GlobalAlloc или HeapAlloc? Из описания я понял, что обе функции работают с кучами.

    Какие тогда существуют различия и под какие задачи какая из функций более подходит?
     
  2. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    GlobalAlloc это фактически как правило и есть HeapAlloc. Первая оставлена для совместимости.
     
  3. ZX_CodeR

    ZX_CodeR New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2007
    Сообщения:
    48
  4. tender_swallow

    tender_swallow New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    45
    Собственно оттуда я и взял информацию по этим функциям. Про обе функции написано что они распределяют память заданного размера из кучи. Так же там имеется примечание, что желательнее использовать функции работы с кучами "heap functions". Но мне бы хотелось узнать какие-либо особенности от людей работавших с обоими видами функций.
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    дык я же и написал :\
     
  6. tender_swallow

    tender_swallow New Member

    Публикаций:
    0
    Регистрация:
    4 май 2007
    Сообщения:
    45
    Ну все если никаких более различий нет, то тему можно считать закрытой, всем спасибо.
     
  7. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    tender_swallow
    Если кратко, то так. Если тебе нужно выделить память ОДИН РАЗ. То используй GlobalAlloc. Если ты ПОСТОЯННО выделяешь и освобождаешь память маленькими кусочками, тогда используй HeapCreate или GetProcessHeap, а затем можешь вызывать функции HeapAlloc и HeapFree. Это будет довольно эффективно.

    А если подробно, то
    GlobalAlloc в Windows является основной функцией для выделения памяти в пользовательском адресном пространстве. Если ты хочешь выделить кусок памяти под что либо, то от нее тебе никуда не деться.

    Для того чтобы тебе пользоваться функциями HeapAlloc и HeapFree тебе необходимо сначала вызвать функцию HeapCreate. Функция HeapCreate внутри себя все равно вызывает GlobalAlloc, с размером памяти, который ты указал в параметрах HeapCreate. И создается двусвязный список, который отвечает за разметку памяти внутри выделенного участка. Когда после этого ты выделяешь память с помощью HeapAlloc то система больше не переключается в режим ядра чтобы промапить кусок физической памяти в твое адресное пространство, а просто размечает заранее выделенную область, добавляя в двусвязный список новый индекс и быстро возвращает тебе результат.
     
  8. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    по умолчанию одна куча для процесса выделяется.
    неа, Heap** как правило переходники к RtlHeap*, А конкретно RtlCreateHeap вызывает NtAllocateVirtualMemory.

    А вот GlobalAlloc вызывает RtlAllocateHeap.
     
  9. Miller Rabin

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    Вот блин. Была же мысль протрассировать функции перед постом, чтоб не ошибиться. но лень было.
    Твоя правда.
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    имхо путаешь с VirtualAlloc & ZwAllocateVirtualMemory
     
  11. leo

    leo Active Member

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

    Miller Rabin New Member

    Публикаций:
    0
    Регистрация:
    4 янв 2006
    Сообщения:
    185
    leo
    Все ясно. До сегодняшнего момента я был уверен, что механизм памяти работает именно так как описал в посте. Оказалось с точностью до наоборот :)