3

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

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

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

4

2 回答 2

4

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

于 2010-03-26T12:45:09.390 回答
2

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

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

于 2010-03-26T12:41:22.010 回答