【问题标题】:A function's static and dynamic parent函数的静态和动态父级
【发布时间】:2010-03-26 12:30:03
【问题描述】:

我正在阅读《C++ 中的思考》(第 2 卷):

每当一个函数被调用时, 有关该功能的信息是 推入运行时堆栈中 激活记录实例 (ARI),也 称为堆栈帧。典型的堆栈 帧包含 (1) 的地址 调用函数(所以执行可以 返回它),(2)指向ARI的指针 函数的静态父级( 词法上包含的范围 调用函数,所以变量是全局的 可以访问该功能),以及 (3) 指向调用函数的指针 它(它的动态父级)。那条路 从逻辑上重复的结果 跟随动态父链接是 动态链或调用链

我无法理解作者作为函数的静态和动态父级的含义。也无法区分项目 1、2 或 3。它们似乎都是一样的。谁能给我解释一下这段话?

【问题讨论】:

  • 我只能看到一个调用者和一个被调用者。而且我知道一旦被调用者返回,调用堆栈就会弹出一次(展开),这会导致帧指针递减并指向父函数(调用者)。

标签: c++ dynamic static parent callstack


【解决方案1】:

我认为这句话不是关于 C++ 而是堆栈帧的一般结构。 1) 是返回地址——主函数中call 之后的指令地址。执行返回时,它将从堆栈中poped 并且执行将转到该点(对 c++ 有效) 2) 和 3) 对允许嵌套函数的语言有效。 (函数内部声明的函数)此类函数可以访问父级的变量,因此它们具有到父级堆栈框架的链接(静态链接),而动态链接是为了让该函数能够递归调用自己

【讨论】:

    【解决方案2】:

    这对我来说听起来很奇怪。静态帧指针通常用于具有词法范围的语言,例如函数式语言,以及带有嵌套函数的 pascal 系列。全局变量在编译时或运行时绑定一次,并且不需要帧指针。 (1) 有效,但 (2) 在 C++、AFAIK 中不存在。

    我怀疑 (3) 是指父帧指针。调用堆栈通常设置为链表,以便调试器和相关工具无需深入了解程序即可遍历它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-09-08
      • 2011-10-04
      • 1970-01-01
      • 2023-02-10
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多