возврата и из-за этого у нас может быть переполнение стека ? Или в стек передаются ещё какие-нибудь данные, просто не понимаю, не вижу смысла сохранять локальные переменные вызывающей функции,они же хранятся в другой области памяти( я про локальные переменные функции, а не передаваемые параметры) ?
Да, может быть переполнение стека, если рекурсия слишком глубокая или вообще неограниченная. Да, в стек передаются аргументы в том числе (в x86 все, в x86-64 только те, что не влезли в регистры). Локальные переменные лежат там же, рядом с аргументами по другую сторону от адреса возврата. Хранить их нужно, потому что они могут понадобиться вызывающей функции, если рекурсия не хвостовая. pop использовать можно, это рушит кадр стека, затрудняя отладку (и вроде нарушает ABI), но можно. Но для этого сначала придётся вытолкнуть и где-то хранить адрес возврата, пожертвовав для этого целым регистром, а их и так не хватает обычно.
Обсуждают сегодня