VirtualAlloc vs HeapAlloc

Тема в разделе "WASM.WIN32", создана пользователем veach1, 12 май 2005.

  1. veach1

    veach1 New Member

    Публикаций:
    0
    Регистрация:
    16 янв 2004
    Сообщения:
    40
    Приветствую!



    Посоветуйте плиз, какую из виндовых функций лучше использовать для создания (и обработки) 13 динамическимх массивов по ~20000 элементов в каждом массиве, каждый элемент (заполненная структура) весит не более 1кб данных.



    Спасибо.
     
  2. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Если пишешь на дельфи, то юзай GetMem, если API, то HeapAlloc.

    Если сильно нужна производительность, то можно создать длл на дельфи и с нее экспортировать GetMem/FreeMem (размер длл около 15 кил) или пиши свой менеджер кучи.
     
  3. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    13 * 20000 * 1Kb == 260Mb

    HeapAlloc не пойдёт. Только VirtuaAlloc
     
  4. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Да, VirtualAlloc, но вызвать один раз для резервирования сразу 260Мб, а не 13 раз по 20Мб.
     
  5. leo

    leo Active Member

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



    Менеджер кучи нужен до кучи :)))

    Т.е. тогда, когда - куча-мала :)))



    Ладно, оставим каламбуры. Полноценные менеджеры нужны тогда, когда неизвестно какого размера и в каком порядке будут создаваться и освобождаться блоки памяти, а точнее известно, что могут быть любого размера и в любом порядке. Если максимальный размер достаточно большой и известен заранее как в данном случае, то остается пара вариантов: либо несколько отдельных аллоков на каждый массив, либо общий VirtualAlloc с mem_reserve и тривиальным менеджером для контроля и наращивания mem_commit.



    Что касается HeapXXX:

    1) в Win 9x Heap ограничена 4Mb, поэтому если нужно больше 1-2Мб, то "настоятельно рекомендуют" Virtual

    2) в NT-based'ах по моему скромному ИМХО при вызове HeapXXX рулит некое правило: если размер < big_alloc (порядка 1Мб), то рулит классический хиповый менеджер, а если больше, то вызывается тот же VirtualAlloc.