Что определяет размер стека в потоке в C++?
Я использую C++ и Windows.h в моем исходном коде. Я прочитал API CreateThread в MSDN, но я все еще не понимаю сути указания размера стека. По умолчанию это 1 МБ. Но что произойдет, если я укажу 32 байта?
Что определяет размер стека в потоке?
пожалуйста, предоставьте подробное объяснение, и я ценю это. Спасибо.
3 ответов
стек используется для хранения локальных переменных, передачи параметров в вызовах функций, хранения обратных адресов. Стек нити имеет фиксированный размер, который определяется при создании потока. Это и есть та ценность, о которой вы говорите.
размер стека определяется при создании потока, так как он должен занимать непрерывное адресное пространство. Это означает, что все адресное пространство для стека потока должно быть зарезервировано в момент создания потока.
Если стек слишком мал, то он может переполниться. Это условие ошибки, известное как переполнение стека, из которого этот сайт получил свое название. При вызове функции происходит некоторое или все следующее:
- параметры помещаются в стек.
- обратный адрес помещается в стек.
- создается кадр стека, содержащий пространство для локальных переменных функции.
все это потребляет пространство из стека. Когда функция в свою очередь вызывает другую функцию, потребляется больше пространства стека. По мере углубления стека вызовов требуется больше пространства стека.
следствие поэтому устанавливать размер стога слишком низко что вы можете вымотать стог и переполнить его. Это предельное состояние, от которого вы не можете оправиться. Конечно, 32 байта (округленные до одной страницы, которая составляет 4096 байт) слишком мала почти для всех потоков.
Если у вас есть программа с большим количеством потоков, и вы знаете, что потоку не нужно резервировать 1 МБ размера стека, тогда могут быть преимущества использования меньшего размера стека. Это позволяет избежать исчерпания доступного адресного пространства процесса.
с другой стороны, у вас может быть программа с одним потоком, который имеет глубокие стеки вызовов, которые потребляют большое количество пространства стека. В этом случае можно зарезервировать более 1 МБ по умолчанию.
однако, если у вас нет веской причины в противном случае, вероятно, лучше придерживаться размера стека по умолчанию.
размер стека - это просто компромисс между возможностью создания многих потоков и возможностью переполнение стека в одном из них.
чем больше размер стека, тем меньше потоков вы можете создать и тем меньше вероятность переполнения стека. Вы должны беспокоиться о размере стека, только если вы собираетесь создать много потоков (вам придется уменьшить размер стека, но помните о переполнении стека). В противном случае достаточно значения по умолчанию.
но что произойдет, если я укажу 32 байта?
Я не читал документацию Windows, но если Windows позволяет это (указать только 32 байта), вы, скорее всего, получите переполнение стека. Согласно их документации, значение округляется до размера страницы в anycase, поэтому на самом деле размер стека будет по крайней мере размером страницы. Созданный поток предполагает, что существует достаточно "пространства стека" для его использования (для автоматического выделения переменные, адреса функций хранения и т. д.) и выделяет пространство в соответствии с его потребностями. Когда недостаточно места в стеке, распределитель стека может использовать недопустимую память, переопределяя память, используемую в другом месте.
что определяет размер стека в потоке?
Он определяет, сколько памяти будет выделено для стека потока.
существует хорошее описание того, что именно стек вызовов потока здесь