Статический и динамический родитель функции - PullRequest
3 голосов
/ 26 марта 2010

Я читаю Thinking in C ++ (том 2):

Всякий раз, когда вызывается функция, информация об этой функции выдвинут на стек времени выполнения в экземпляр записи активации (ARI), также называется стековым фреймом. Типичный стек кадр содержит (1) адрес вызывающая функция (поэтому выполнение может вернуться к нему), (2) указатель на ARI статический родитель функции ( объем, который лексически содержит называется функция, поэтому переменные глобальные к функции можно получить доступ), и (3) указатель на функцию, которая вызывала это (его динамический родитель). Путь, который логически вытекает из повторяющихся после динамических родительских ссылок динамическая цепочка или цепочка вызовов

Я не могу понять, что автор имеет в виду как статический и динамический родительский элемент функции. Также не могу различить пункты 1, 2 или 3. Все они кажутся одинаковыми. Может кто-нибудь объяснить мне этот отрывок?

Ответы [ 2 ]

4 голосов
/ 26 марта 2010

Я думаю, что это утверждение не о C ++, а об общей структуре фрейма стека. 1) адрес возврата - адрес инструкции после call в основной функции. когда возврат будет выполнен, он будет pop удален из стека, и выполнение перейдет к этой точке (действительно для c ++) 2) и 3) действительны для языков, которые допускают вложенные функции. (Функция объявлена ​​внутри функции) такие функции могут иметь доступ к родительским переменным, поэтому у них есть ссылка (статическая ссылка) на фрейм стека родителя, и динамическая ссылка позволяет этой функции вызывать себя рекурсивно

2 голосов
/ 26 марта 2010

Все это звучит очень странно для меня. Статические указатели фреймов обычно используются в языках с лексической областью, таких как функциональные языки и семейство паскалей с их вложенными функциями. Глобальные переменные связываются один раз либо во время компиляции, либо во время выполнения и не должны нуждаться в указателях кадров (1) допустимо, но (2) не существует в C ++, AFAIK.

Я подозреваю, что (3) должен был ссылаться на указатель родительского кадра. Стеки вызовов обычно настраиваются как связанные списки, чтобы отладчики и связанные с ними инструменты могли обходить их, не требуя глубоких знаний о программе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...