Heap or Stack?

Тема в разделе "WASM.BEGINNERS", создана пользователем Clyde, 29 апр 2009.

  1. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    Где предпочтительней выделять память, в стеке или на куче в плане оптимизации
    быстродействия\расхода ресурсов?
    Почему? Или же нет принципиальной разницы?
     
  2. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Принципиальной разницы нет.
    Но если речь идет о небольших объемах в десятки-сотни байт, то стек м.б. более предпочтительным, т.к. и само "выделение" памяти в нем происходит мгновенно (add esp,X), и cтек используется чаще, поэтому область адресов вблизи текущего esp как правило всегда находится в кэше. А выделение памяти в куче и происходит дольше (сотни тактов) и нет гарантии, что будет выделен блок, который ранее (недавно) использовался, и соотв-но его может не быть в кэше и соотв-но плюс еще пару сотен тактов на его загрузку из ОЗУ в кэш. Но разумеется это только начальные затраты на выделение участка памяти, а при дальнейшем обращении к ней на чтение\запись ес-но пофиг, где она находится в стеке или в куче
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Маленькое и временное лучше в стеке, поскольку это быстрее - одна команда sub esp, вместо тяжеловесного вызова API, большое и долгоиграющее лучше в куче, поскольку стек не резиновый, а относительные затраты на обращение к куче в больших массивах микроскопичны.
    Кстати если выделяешь в стеке больше страницы (4кб) за один заход, то нужно быть осторожным если обратиться за пределы строжевой страницы стека прога упадёт, чтобы этого избежать нужно либо заполнять такой массив "с конца" т.е. от старших адресов к младшим, либо предварительно "пробежаться" по нему от конца к началу с шагом 4кб.
     
  4. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    leo,Y_Mur
    а если программа многопоточная?
     
  5. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    То у каждого потока свой стек и соответсвенно внутри потока правила те-же, а для "общих" данных конечно юзать кучу.
     
  6. Clyde

    Clyde New Member

    Публикаций:
    0
    Регистрация:
    29 мар 2009
    Сообщения:
    154
    Y_Mur
    поэтому я и задал свой вопрос :)
    все понятно, спасибо
     
  7. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    А "общие" данные лучше вообще не юзать или юзать "редко", т.к. иначе на многоядерных компах могут быть доп.тормоза на синхронизацию линеек кэшей первого уровня (а на атлонах и второго).