我正在阅读C ++思考(第2卷):
每当调用一个函数时, 有关该功能的信息是 推送到运行时堆栈中 激活记录实例(ARI)也是 称为堆栈帧。一个典型的堆栈 frame包含(1)的地址 调用函数(所以执行可以 返回它),(2)指向ARI的指针 函数的静态父级( 词法包含词汇 调用函数,所以变量全局 可以访问该功能),和 (3)指向被调用函数的指针 它(它的动态父母)。那道路 逻辑上是重复的结果 跟随动态父链接是 动态链或调用链
我无法理解作者的意思是函数的静态和动态父级。我也无法区分第1,2或3项。它们似乎都是相同的。有人可以向我解释这段话吗?
答案 0 :(得分:4)
我认为这个陈述不是关于C ++而是堆栈框架的一般结构。
1)是返回地址 - 主函数中call
之后的指令地址。当执行返回时,它将从堆栈pop
开始,执行将转到该点(对c ++有效)
2)和3)对允许嵌套函数的语言有效。 (在函数内部声明的函数)这样的函数可以访问父变量,因此它们具有到父级堆栈帧的链接(静态链接),动态链接用于此函数能够递归地调用自己
答案 1 :(得分:2)
这对我来说听起来很奇怪。静态帧指针通常用于具有词法范围的语言(例如函数语言)和具有嵌套函数的pascal族。 Globals在编译时或运行时绑定一次,不应该需要帧指针。 (1)有效,但(2)在C ++,AFAIK中不存在。
我怀疑(3)是指父帧指针。调用堆栈通常设置为链接列表,以便调试器和相关工具可以在不需要深入了解程序的情况下使用它们。