Логический стек растёт как a1 → a2 → a3, затем раскручивается в обратном порядке. В глубочайшей точке активны y, z и x своих вызовов.
Понимание работы стека вызовов функций
Логический стек растёт как a1 → a2 → a3, затем раскручивается в обратном порядке. В глубочайшей точке активны y, z и x своих вызовов.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
В задании требуется проанализировать, как формируется и удаляется стек вызовов при последовательных вызовах функций. Нужно понять, какие переменные находятся в стеке в каждый момент выполнения программы.
func a3(){
let x = 5
}
func a1(){
let y = 5
a2()
}
func a2(){
let z = 3
a3()
}
a1()
Определите, как меняется стек от начала выполнения a1() до полного завершения всех функций.
Ответ
Логический стек растёт как a1 → a2 → a3, затем раскручивается в обратном порядке. В глубочайшей точке активны y, z и x своих вызовов.
После входа в a1 появляется его кадр и локальное y = 5. Вызов a2 добавляет кадр с z = 3, затем a3 — с x = 5. При возврате из a3 исчезает его кадр, затем завершается a2 и наконец a1. Это модель исполнения, а не обещание конкретной физической раскладки: оптимизатор может удалить неиспользуемые переменные и вызовы либо выполнить inlining. Для отладочного разбора важно различать область видимости и фактическое хранение значения.