Что такое «стек» в отношении .Net? - PullRequest
8 голосов
/ 10 января 2010

Простите, если это глупый вопрос, но я боюсь, что я не знаю, что такое «стек».

Я знаю, что такое «стек», и я выучил сокращения FILO / FIFO. Но когда люди говорят что-то вроде «тип значения выделяется в стеке , а не в куче» - боюсь, я действительно не знаю, что это значит.

Когда я ввожу логическую ошибку в рекурсивную функцию - я не могу выделить больше памяти для «стека», и мое приложение падает ... но я не понимаю, что это такое.

Я пытался найти ответ в Google, но нашел только информацию о «стеке» и о том, как его использовать.

Когда я запускаю .Net App - создает ли он один «экземпляр стека», который действует как «Стек»? Я видел трассировки стека, которые показывают мне уровни выполнения кода - чаще всего, когда я сталкиваюсь с незапланированным исключением ... но все, что я помню, я мог видеть, это методы и порядок их вызова ... не будет у стека также есть все переменные в области действия для каждого шага стека.

Может быть, я просто глупый - но я думаю, что мог бы представить ситуацию с рекурсивной функцией, где было бы удобно увидеть предыдущее значение переменной - из «стека», но нет необходимости передавать его дюймы

Не знаю, имеет ли это какой-то смысл - ужасно поздно. Но я был бы очень признателен за любую информацию.

1 Ответ

18 голосов
/ 10 января 2010

Этот термин относится к стеку вызовов . Вы могли бы узнать больше о концепциях на низкоуровневом курсе по программированию или компьютерной архитектуре / организации, если бы выбрали один из них.

Каждый раз, когда вызывается функция, адрес возврата (откуда она вызывается), а также параметры функции помещаются в «стек» (стек в памяти, но нет, не в структуру данных стека C #). о котором вы читали бы в MSDN). Когда функция завершается, адрес извлекается из стека, и управление возобновляется с того места, где оно было изначально (по переданному адресу). Куча информации, относящейся к вызову функции (локальные переменные, адрес возврата, параметры и т. Д.), Называется «стековым фреймом».

Таким образом, когда вы используете рекурсию (и она попадает в бесконечный рекурсивный цикл), вы буквально просто заполняете стек адресами возврата (и другими данными), пока не останется свободного места.

Редактировать - Вы упомянули также кучу . Здесь хранятся структуры данных (динамическое выделение памяти через ключевое слово new в большинстве языков в наши дни или malloc в C). Например, в C / C ++ данные в куче сохраняются до тех пор, пока они не будут явно освобождены. Это должно быть противопоставлено локальным / автоматическим переменным, которые хранятся в стеке (и поэтому уничтожаются, когда их область действия заканчивается ... они выталкиваются из стека из существования).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...