динамическая память

Тема в разделе "WASM.BEGINNERS", создана пользователем Evg666, 24 окт 2005.

  1. Evg666

    Evg666 New Member

    Публикаций:
    0
    Регистрация:
    12 май 2004
    Сообщения:
    17
    Адрес:
    Russia
    Как использовать большие объемы динамической памяти?

    Какие существуют ограничения по размеру блока?
     
  2. Evg666

    Evg666 New Member

    Публикаций:
    0
    Регистрация:
    12 май 2004
    Сообщения:
    17
    Адрес:
    Russia
    Сколько максимум можно выделить HeapAlloc. Какую АПИШКУ лучше использовать при частом изменении размеров блока.
     
  3. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    > "Сколько максимум можно выделить HeapAlloc"

    В win 9х MSDN рекомендует не более 1-2Mb (иначе significant performance degradation), если нужно больше то следует использовать VirtualAlloc.

    В NT-based системах максимальный размер ограничен только доступным непрерывным блоком адресного пространства, т.к. HeapAlloc при size > 512Kб сама выделяет память через VirtualAlloc.



    > "Какую АПИШКУ лучше использовать при частом изменении размеров блока"

    Зависит от размера и количества блоков. Куча ведь по своей сути предназначена для кучи мелких и средних блоков, но изменение размеров в такой куче дело проблематичное, т.к. при увеличении размера в общем случае приходится выделять новый блок и копировать туда данные. Флаг HEAP_REALLOC_IN_PLACE_ONLY в HeapRealloc ничего не гарантирует, т.к. если данный блок "зажат" между двумя другими занятыми блоками, то расти ему ес-но некуда. Увеличение размера на старом месте возможно если только блок является последним в куче или если после него идет свободный блок достаточного размера. Поэтому для реаллокаций больше подходит VirtualAlloc, но использовать ее для множества мелких блоков не эффективно (минимальный размер резерва адресов 64К, выделение физ.памяти по 4К). Поэтому все зависит от конкретной задачи