Эта область обычно используется секцией stack
, потому что stack
может увеличиваться / уменьшаться в зависимости от глубины текущего call stack
. поскольку ваша ссылка указывает, что
Стек процесса содержит временные данные, такие как параметры метода / функции, адрес возврата и локальные переменные.
Как глубина стека вызовов увеличивается?
Чтобы действительно понять это, вам нужно знать, как assembler
обрабатывает вызовы функций. но я постараюсь дать простое объяснение. Поэтому, когда ваш код вызывает function
, связанные с ним данные переводятся в stack
, а stack
увеличивается вниз и , когда execution
из function
завершается, его локальные данные больше не являются необходимо, чтобы stack
уменьшилось.
Но когда ваш код содержит вложенные function
вызовы, то есть function A
вызовы function B
и function B
вызовы function C
. в этом случае стек продолжает расти.
И если ваш код содержит слишком много вложенных function
calls
, стек вашего процесса может расширяться, так что больше нет пустой области. когда это происходит (вероятно, когда вы реализуете recursive
function
без правильного базового случая), мы получаем нашу любимую ошибку переполнения стека .
В следующем разделе приведено визуальное объяснение этого процесса
Допустим, вы запускаете программу, и в псевдокоде это выглядит примерно так:
fun first(arguments){
second();
}
fun second(arguments){
third();
}
fun third(arguments){
print("hello");
}
fun main(){
first(arguments); // line 1
third(arguments); // line 2
}
Когда ваш Программа запускается, ее блок memory
будет выглядеть следующим образом.
Поскольку при запуске вашей программы она вызывает main method
, stack
будет содержать все локальные variable
, связанные с основной функцией.
Когда основная функция вызывает first function
, stack
будет расти вниз, как локальные variable
и другие элементы, связанные с first function
, будут подтолкнуть к stack
. так это выглядит следующим образом.
, поскольку first function
внутренне вызывает second
и second function
внутренне вызывает third
стек будет расширяться до вместить все данные, связанные с second
и third
functions
.
Обратите внимание, что стек будет расти только для вложенных вызовов function
. для Например, когда первая строка в main function
выполнена и execution
переместится на строку 2, stack
уменьшится в размере.