Таким образом, метод B знает, куда идти после его завершения. Метод Б, на самом деле все равно, откуда он взялся.
дыдущем вопросе (Получить иерархию вызовов объектов), Я получилэтот интересный ответ:
Стек вызовов не там, чтобы сказать вам, откуда вы пришли. Это сказать вам, куда вы идете дальше.
Насколько я знаю, при достижении вызова функции программа обычно делает следующее:
Впризвание код:
сохранить обратный адрес (в стеке вызовов)сохранять состояния регистров (в стеке вызовов)записать параметры, которые будут переданы функции (в стеке вызовов или в регистрах)перейти к целевой функцииВназывается целевой код:
Получить сохраненные переменные (при необходимости)Процесс возвратаОтменить то, что мы сделали, когда вызвали функцию, то есть развернуть / вытолкнуть стек вызовов:
удалить локальные переменные из стека вызововудалить переменные функции из стека вызововвосстановить состояние регистров (которое мы сохранили ранее)перейти на обратный адрес (тот, который мы сохранили раньше)Вопрос:
Как это можно рассматривать как то, что«говорит вам, куда вы идете дальше» скорее, чем"сказать вам, откуда вы пришли"?
Есть ли что-то в среде исполнения JIT C # или среды выполнения C #, которая заставляет этот стек вызовов работать по-другому?
Спасибо за любые ссылки на документацию об этом описании стека вызовов - есть много документации о том, как работает традиционный стек вызовов.