Float q;
// 2,5
…………………………………………………
}
//---------------------
int f2(int k){
char p=7;
// 4
p=f1(1,2); // 6
………………………………………………………
}
В процессе работы, программа проходит ряд точек, отмеченных в программе комментариями:
· 1 – после входа в функцию main
· 2 – после входа из main в f1
· 3 –после выхода из f1 в main
· 4 –после входа в f2 в main
· 5 – после входа в f1 из f2
· 6 – после выхода из f1 в функции f2
· 7 – после выхода из f2 в функции main
При входе в функцию программа помещает в программный стек значения аргументов в байты памяти, отводимой для параметров и локальных переменных, после чего вершина стека поднимается (Push). При выходе из функции, вершина стека опускается до уровня, предшествующего входу (Pop). В таблице 1 изображено состояние стека в различных точках программы. По горизонтали – адреса байтов программного стека, по вертикали – номера точек.
x | y | z | ||||||||||||||||||
x | y | z | t | u | q | |||||||||||||||
x | y | z | ||||||||||||||||||
x | y | z | k | p | ||||||||||||||||
x | y | z | k | p | t | u | q | |||||||||||||
x | y | z | k | p | ||||||||||||||||
x | y | z |
Таблица 1. Состояние стека в процессе выполнения программы
Примечания:
- здесь не учитывается выравнивание адресов на границу слова, двойного слова,
- длина типа int – 4 байта,
- не учитывается что адрес точки возврата при обращении к функции тоже помещается в стек.
Использование механизма программного стека для распределения памяти для параметров и локальных переменных (класс памяти automatic) приводит к тому, что никаких дополнительных усилий для реализации рекурсии уже не требуется. Каждое новое обращение к рекурсивной функции помещает в стек новое поколение параметров и локальных переменных.
Дата добавления: 2014-12-02; просмотров: 632;