为了账号安全,请及时绑定邮箱和手机立即绑定

简要说明堆栈框架的概念

简要说明堆栈框架的概念

慕仙森 2019-11-22 14:03:41
看来我在编程语言设计中有了调用堆栈的想法。但是我找不到(也许我只是不够努力地)关于什么是堆栈框架的任何体面的解释。所以我想请某人向我解释一下。
查看完整描述

3 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

堆栈帧是被推入堆栈的数据帧。在调用堆栈的情况下,堆栈帧代表函数调用及其参数数据。

如果我没记错的话,函数的返回地址首先被压入堆栈,然后是局部变量的参数和空间。尽管这可能取决于体系结构,但它们共同构成了“框架”。处理器知道每个帧中有多少字节,并在将帧压入并弹出堆栈时相应地移动堆栈指针。

编辑:

更高级别的调用堆栈和处理器的调用堆栈之间存在很大的差异。

当我们谈论处理器的调用堆栈时,我们谈论的是在汇编或机器代码中以字节/字级别使用地址和值。在谈论高级语言时,有“调用栈”,但是它们是运行时环境管理的调试/运行时工具,因此您可以(在较高级别)记录程序出了什么问题。在此级别上,通常知道行号,方法和类名之类的东西。到处理器获得代码时,它完全没有这些东西的概念。


查看完整回答
反对 回复 2019-11-22
?
鸿蒙传说

TA贡献1865条经验 获得超7个赞

如果您非常了解堆栈,那么您将了解内存在程序中的工作方式,如果您了解内存在程序中的工作方式,则将了解函数在程序中的存储方式,如果您了解函数在程序中的存储方式,则将了解递归函数的工作方式以及是否您了解递归函数的工作原理,您将了解编译器的工作原理,如果您了解编译器的工作原理,那么您的想法将像编译器一样工作,并且您将很容易调试任何程序


让我解释一下堆栈是如何工作的:


首先,您必须知道函数如何存储在堆栈中:


堆存储动态内存分配值。堆栈存储自动分配和删除值。


在此处输入图片说明


让我们用例子来理解:


def hello(x):

    if x==1:

        return "op"

    else:

        u=1

        e=12

        s=hello(x-1)

        e+=1

        print(s)

        print(x)

        u+=1

    return e


hello(4)

现在了解该程序的各个部分:


现在让我们看看什么是堆栈以及什么是堆栈部分:


堆栈分配:


请记住一件事,无论任何函数加载了他的所有本地变量,或者任何将立即从堆栈返回的东西都将返回其堆栈框架,该函数都会“返回”。这意味着当任何递归函数获得基本条件并且我们在基本条件之后放置return时,这样基本条件将不会等待加载位于程序“ else”部分中的局部变量,它将立即从堆栈中返回当前帧,现在如果返回一帧返回下一帧在激活记录中。实际看到这一点:


块的解除分配:


因此,现在无论何时找到返回语句的函数,它都会从堆栈中删除当前帧。


从堆栈返回时,值将以它们在堆栈中分配的顺序相反的顺序返回。


查看完整回答
反对 回复 2019-11-22
?
婷婷同学_

TA贡献1844条经验 获得超8个赞

快速总结。也许有人有更好的解释。

调用堆栈由1个或多个堆栈帧组成。每个堆栈帧对应于对尚未返回的终止函数或过程的调用。

要使用堆栈框架,线程保留两个指针,一个称为堆栈指针(SP),另一个称为帧指针(FP)。SP始终指向堆栈的“顶部”,而FP始终指向框架的“顶部”。此外,该线程还维护一个程序计数器(PC),该计数器指向要执行的下一条指令。

以下内容存储在堆栈中:局部变量和临时变量,当前指令的实际参数(过程,函数等)

关于清理堆栈有不同的调用约定。


查看完整回答
反对 回复 2019-11-22
  • 3 回答
  • 0 关注
  • 686 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信