Dolarun
@Dolarun

Почему в СТЕКЕ разрешается выделять достаточно мало памяти?

Заметил, что стек у программ достаточно мал, не превышает обычно 10 МБ по умолчанию. С чем же это связано? Большинство ресурсов выделяется динамически? Но ведь это намного дороже, чем в стеке. Или можно самостоятельно определять размер стека? У меня нет опыта в программирование, может я чего-то не понимаю.
  • Вопрос задан
  • 322 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Да, большинство ресурсов выделяется динамически.

Во-первых, потому что стек программе выделяется один раз сразу, а вот динамическую память все программы разделяют между собой. И пока одна программа ест гигабайт - вторая программа может жрать 10, а когда вторая завершится - первая может съесть эти 10 гигабайт. Со стеком так не получится, он должен быть непрерывен по адресам. И тогда каждой программе придется всегда выделять себе максимально возможный объем памяти, даже если он может не понадобится. Именно поэтому программы обычно не выделяют много стека.

Во-вторых, часто неизвестно заранее, сколько и каких ресурсов надо будет выделять. Плюс ресурсы могут быть использованны в куче разных функций, а значит должны жить глобально или отдельно от какой-то одной функции (например в main), но тогда все будет в куче в одном месте и это тупо неудобно.

А так, для ускорения выделения памяти есть, например, аллокаторы на стеке: Заводится локальный массив и специальный менеджер памяти вместо выделения ее в куче, выделяет куски из этого массива. Но их не используют для хранения больших объемов данных по первой причине - это очень расточительно по памяти.

Edit: да, если вам нужно больше стека, можно сделать так, чтобы программа получала больше стека. В С++ это делается параметром линкера.
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Adamos
@Adamos
Большинство ресурсов выделяется динамически? Но ведь это намного дороже, чем в стеке.

О дороговизне выделения памяти необходимо помнить, если это происходит часто: в цикле, в постоянно вызываемых функциях и т.п. Вряд ли вы области на многомегабайт выделяете миллионы раз в секунду. А если вы время от времени хапаете памяти мегабайтами и потом сравнительно долго работаете с ней - собственно затраты на ее выделение пренебрежимо малы.
Ответ написан
Комментировать
@res2001
Developer, ex-admin
Память на стеке в подавляющем большинстве случаев выделяется под переменные, зависимые от области видимости. Эти переменные с не большим временем жизни, а значит в большинстве случаев они не слишком большие и их можно смело выделить на стеке.
Если у вас переменная с неопределенным временем жизни, то ее место в динамической памяти. Если ваша программа регулярно создает и уничтожает подобные переменные на большом временном промежутке, то стоит задуматься о реализации собственного аллокатора для подобных переменных, который бы один раз выделял память под относительно большой пул и уже из него отдавал программе куски памяти для размещения в них переменных.
Кстати, в линуксе по умолчанию стек 8Мб, в винде 1Мб.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы