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