当前位置: 首页 > 知识库问答 >
问题:

简而言之,解释堆栈框架的概念

东门修文
2023-03-14

似乎我在编程语言设计中得到了调用堆栈的想法。但是我找不到(可能,我只是搜索不够努力)任何关于堆栈帧是什么的体面解释。

所以想请个人用几句话给我解释一下。

共有3个答案

西门安民
2023-03-14

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

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

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

堆栈中存储了以下内容:

  • 局部变量和临时变量;
  • 当前指令的实际参数(过程、函数等)。

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

欧阳君浩
2023-03-14

如果你非常了解堆栈,那么你就会理解内存在程序中是如何工作的,如果你了解内存在程序中是如何工作的,你就会明白函数在程序中是如何存储的,如果你了解函数在程序中的存储,你就会明白递归函数是如何工作的,如果你了解递归函数是如何工作的,你就会理解编译器是如何工作的,如果你了解编译器是如何工作的,你的思想将像编译器一样工作。您将非常容易地调试任何程序

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

首先,您必须知道函数在堆栈中是如何表示的:

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

让我们通过例子来理解:

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)

现在了解这个程序的部分内容:

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

堆栈的分配:

记住一件事:如果任何函数的返回条件得到满足,无论它是否加载了局部变量,它都会立即从堆栈中返回它的堆栈帧。这意味着每当任何递归函数得到满足的基本条件,并且我们在基本条件后面放一个返回值时,基本条件都不会等待加载位于程序“else”部分的局部变量。它将立即从堆栈返回当前帧,接下来的帧现在位于激活记录中。

在实践中看到这一点:

区块的解除分配:

因此,现在每当函数遇到return语句时,它都会从堆栈中删除当前帧。

从堆栈返回时,值将按照在堆栈中分配的原始顺序反向返回。

吕承福
2023-03-14

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

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

高级调用堆栈和处理器的调用堆栈之间有很大的区别。

当我们谈论处理器的调用堆栈时,我们谈论的是在汇编或机器代码中处理字节/字级别的地址和值。当谈论更高级别的语言时,有“调用堆栈”,但它们是由运行时环境管理的调试/运行时工具,这样你就可以记录你的程序出了什么问题(在高级别)。在这个级别,像行号、方法和类名这样的东西通常是已知的。当处理器拿到代码时,它对这些东西完全没有概念。

 类似资料:
  • 因此,我知道对堆栈中分配的变量调用会导致无效指针错误。 在ED指针中,在实际指针之前分配8个字节,以保留关于指针大小的信息。因此,我想知道是否在一个结构之前做了一个,然后在该结构上调用free,是否可以释放该结构(当然,这偏离了分配这8个字节是所做的唯一额外的事情的假设)。 我想我的最后一个问题是,堆栈变量分配和堆分配之间是否有真正的区别(就后端对内核的调用而言)。

  • 问题内容: 最近,我一直在寻找Java虚拟机规范(JVMS),以试图更好地理解使我的程序正常工作的原因,但是我找到了一段我不太了解的部分… 第4.7.4节介绍了 StackMapTable 属性,在该节中,文档介绍了有关堆栈映射框架的详细信息。问题是它有点罗word,我以身作则,学得最好。不读书。 我知道第一个堆栈映射框架是从方法描述符派生的,但是我不知道如何(应该在这里进行解释。)而且,我也不完

  • 问题内容: 我想知道是否有人可以指出有关解释用提取的Java线程堆栈的信息。 我的情况是我在GlassFish v2.1.1上运行了一个Java EE 5应用程序,该应用程序定期挂起(每天至少挂2次-3次)。要使其再次运行,我必须终止Glassfish进程并重新启动域。 。应用程序通常会变得越来越慢,直到最终完全挂起。一旦挂起,我将无法获得线程堆栈。我已经能够获得一个线程堆栈,因为它变得越来越慢,

  • 我有vframe函数并生成了如下的汇编代码 如果我们看到从8到11行,我们没有在堆栈上推送p的地址,但汇编已经假设 如果我们希望某些参数不被破坏,我们会推送一些寄存器并将被调用者保存的寄存器移动到推送的寄存器。但是,在这种情况下,似乎不是。关于局部变量还有其他约定吗,比如i和

  • Python/CS新手,试图了解特定递归函数如何“在引擎盖下”工作,函数的堆栈框架如何运行,它们“持有”的值是什么 我知道这里有很多关于递归函数的文章/帖子,这里有它们如何工作的示例,但递归的概念和堆栈如何工作/它们在递归函数中的作用有点棘手,我找不到任何清晰简洁的解释。 假设我们有以下递归函数来反转字符串中的字符: 其输出为:< code>olleh 我认为<code>reverse_strin

  • 框架概述 本文档描述了 EasyReact 框架的不同组件的高层描述,并试图解释它们如何协同工作。你可以把本文档作为一个学习起点,并找到更多相关的具体文档。 要寻找例子或者深入理解如何使用 EasyReact,请参考 README 和 BasicOperators。 理论基础 本框架的理论基础是图论中的有向有环图。由节点和边构成了数据的连接,边的方向表达了流动方向。 节点 我们用 EZRNode\