Базовый CS с нуля
Функции и стек вызовов: обзор на припоминание
Припоминание сильнее перечитывания. Для каждой подсказки произнесите или запишите полный ответ по памяти, прежде чем открыть образцовый, — именно усилие вытащить механизм из головы закрепляет его.
Восстановите спину юнита по памяти — что такое функция на уровне машины, что хранит кадр стека, как параметры и значения возврата пересекают границу, почему область видимости и время жизни заканчиваются вместе с кадром, и что рекурсия делает со стеком.
- 01Что такое функция на уровне машины и что именно делает инструкция CALL?
- 02Что содержит кадр стека и когда он кладётся и снимается?
- 03Почему стек вызовов работает по принципу LIFO и что это значит для того, какой кадр завершается первым?
- 04Как параметры попадают в функцию и как значение возврата выходит, и почему передача по значению безопасна?
- 05В чём разница между областью видимости локальной переменной и её временем жизни, и что с ней происходит при возврате функции?
- 06Что такое рекурсия в терминах стека, каковы её две части и что вызывает переполнение стека?
Если вы смогли восстановить каждый ответ по памяти, вы держите спину юнита: функция — это именованный адрес, CALL сохраняет адрес возврата и переходит, каждый вызов кладёт LIFO-кадр из адреса-возврата-плюс-локальные-переменные, параметры копируются внутрь, а значение возврата приходит наружу через эту границу, область видимости и время жизни локальной переменной заканчиваются при снятии её кадра, а рекурсия — это та же укладка кадра, повторённая снова, ограниченная только достижимым базовым случаем до переполнения стека.