函数的静态和动态父函数
我正在阅读《Thinking in C++》(第 2 卷):
每当调用函数时, 有关该功能的信息是 推入运行时堆栈 激活记录实例(ARI),也 称为堆栈帧。典型的堆栈 帧包含(1)的地址 调用函数(因此执行可以 返回它),(2)指向 ARI 的指针 函数的静态父函数( 词法上包含的范围 称为函数,因此变量是全局的 可以访问该函数),并且 (3) 指向调用函数的指针 它(它的动态父级)。所走的路 逻辑上的结果是重复的 跟随动态父链接的是 动态链或调用链
我无法理解作者作为函数的静态和动态父级的含义。我也无法区分第 1、2 或 3 项。它们似乎都是相同的。有人可以向我解释一下这段文字吗?
I'm reading Thinking in C++ (vol. 2):
Whenever a function is called,
information about that function is
pushed onto the runtime stack in an
activation record instance (ARI), also
called a stack frame. A typical stack
frame contains (1) the address of the
calling function (so execution can
return to it), (2) a pointer to the ARI of
the function’s static parent (the
scope that lexically contains the
called function, so variables global
to the function can be accessed), and
(3) a pointer to the function that called
it (its dynamic parent). The path that
logically results from repetitively
following the dynamic parent links is
the dynamic chain, or call chain
I'm unable to comprehend what the author means as function's static and dynamic parent. Also am not able to differentiate between item 1, 2 or 3. They all seem to be the same. Can someone please explain this passage to me?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
我认为这个说法不是关于C++,而是关于堆栈框架的一般结构。
1) 是返回地址-主函数中
调用
之后的指令地址。当执行 return 时,它将从堆栈中弹出并执行到该点(对 C++ 有效)2) 和 3) 对于允许嵌套函数的语言有效。 (函数内部声明的函数)此类函数可以访问父级的变量,因此它们具有到父级堆栈帧的链接(静态链接),而动态链接是为了使该函数能够递归地调用自身
I think this statement is not about C++ but general structure of stack frame.
1) is return address - address of instruction after
call
in main function. when return is performed it will bepop
ed from stack and execution will go to that point (valid for c++)2) and 3) are valid for languages that allow nested functions. (Function declared inside function) such functions may have access to parent's variables, so they have link (static link) to parent's stack frame and dynamic link is for this functions to be able call themselves recursively
这一切对我来说听起来很奇怪。静态帧指针通常用在具有词法作用域的语言中,例如函数式语言以及具有嵌套函数的 pascal 系列。全局变量在编译时或运行时绑定一次,并且不需要帧指针。 (1) 是有效的,但 (2) 在 C++ 中不存在,据我所知。
我怀疑 (3) 是指父框架指针。调用堆栈通常设置为链表,以便调试器和相关工具可以遍历它们,而无需深入了解程序。
This all sounds very odd to me. Static frame pointers are normally used in languages with lexical scope, such as functional languages, and the pascal family with their nested functions. Globals are bound once either at compile time or runtime, and shouldn't need frame pointers. (1) is valid, but (2) doesn't exist in C++, AFAIK.
I suspect that (3) was meant to refer to the parent frame pointer. Call stacks are usually setup as linked lists so that debuggers and related tools can walk them without requiring deep knowledge of the program.