问题标签 [stack-frame]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 堆栈帧占用的大小
Java堆栈为每个方法调用创建新框架,但是这个框架是否占用堆栈上的内存?
为了澄清我的问题:
其输出与以下内容相同:
但是第二个片段是否在堆栈上占用更多内存或相等?简而言之,堆栈帧是否占用内存?
编辑:堆栈帧占用多少内存?Sun(现在是 Oracle)是否有任何规范?
assembly - 什么是 ESP 和 EBP 寄存器?
我发现 ESP 寄存器是当前堆栈指针,而 EBP 是当前堆栈帧的基指针。但是,我不理解这些定义(我刚刚开始学习如何在汇编程序中编码)。
我的理解是 ESP 指向堆栈本身,而 EBP 指向堆栈顶部的任何内容1。但这些只是我的猜测,它们很可能是不正确的。否则,像下面这样的陈述是什么意思?
脚注 1:编者注:是的,这是不正确的。在标准术语中,“堆栈顶部”是 ESP 指向的位置,即使它是堆栈帧中的最低地址。类似于向上增长的堆栈数据结构,即使 x86 上的调用堆栈(与大多数 ISA 一样)向下增长。
templates - D 如何允许委托作为模板参数?
在 Andrei Alexandrescu 的“The D Programming Language”中,
有一个将委托作为模板参数的示例:
Alexandrescu 解释说这是可行的,因为委托实际上是一个胖指针,由两部分组成:函数指针和指向其堆栈帧的指针(这就是 z 在其主体内可访问的原因)。除了 find 将“pred”作为 TEMPLATE 参数,而不是作为参数。并且模板参数只能是编译时常量。
我确定我们单元测试中匿名委托的地址确实是一个编译时常量,但它的栈帧地址肯定不应该是,那么委托如何作为模板参数呢?
这里到底发生了什么?
gdb - 堆栈从堆栈中间展开
我正在学习 gdb 调试器,我无法回答的一个问题是:新函数调用导致为它们分配额外的堆栈帧,并且调用堆栈向下增长;堆栈帧被释放并返回到未使用的内存。是否有可能删除堆栈中间的帧并返回内存?go to statement 或 longjmp 函数可以实现吗?
非常感谢。
function - 理解递归和栈帧的遍历
这不是一个家庭作业问题。我只是想了解我自己的造就过程。作为一名计算机科学专业的学生,我参加了几场讨论递归概念的讲座。但是,在我看来,讲师对于堆栈帧的概念以及如何遍历调用堆栈以计算最终值有些模糊。我目前设想该过程的方式类似于从上到下构建一棵树(将项目推入调用堆栈 - 后进先出数据结构),然后爬上新构建的树,在此获得最终值到达顶部。也许是典型的例子:
如上所述,我认为调用堆栈最终类似于以下(粗略)绘制的图:
每个数字都将被“封闭”在堆栈帧中,并且控制现在从底部(值为 1)到 2,然后是 3,依此类推。不过,我不完全确定操作员在过程中的位置。我会错误地假设在某些时候涉及抽象语法树(AST),还是存在包含运算符的第二个堆栈?
谢谢您的帮助。
~凯特琳
编辑:删除了“递归”标签并添加了“功能”和“堆栈帧”标签。
arrays - 用汇编语言将数组复制到堆栈帧
假设我必须复制和排列,称为 X,到 Stack 框架。然后在退出过程之前在屏幕上显示该堆栈帧。我将如何将该数组复制到堆栈帧。我想出了这个,但它不起作用。
那么如何使用 EBP 将数组 X 添加到堆栈帧中。我没有使用欧文或任何东西。仅 .386 .MODEL flat,stdcall
.STACK 4096
我正在使用 Microsoft Visual C++
c++ - 汇编语言栈帧和数组
我正在尝试用汇编语言创建一个程序,将数组复制X
到堆栈帧并在退出程序之前在屏幕上显示堆栈帧。这是我到目前为止所写的,它只是给我错误,因为它没有在 Microsoft C++ Visual Studio 上编译。
这是将数组添加到堆栈的正确方法吗?我将如何显示其内容?
java - 什么是堆栈图框
我最近一直在查看Java 虚拟机规范(JVMS) 以试图更好地理解是什么让我的程序工作,但我发现了一个我不太了解的部分......
第4.7.4 节描述了StackMapTable属性,在该部分中,文档详细介绍了堆栈映射框架。问题是它有点罗嗦,我最好通过例子来学习;不是通过阅读。
我知道第一个堆栈映射框架是从方法描述符派生的,但我不明白如何(应该在这里解释)。另外,我不完全理解堆栈映射框架的作用。我会假设它们类似于 Java 中的块,但看起来好像你不能在彼此内部拥有堆栈映射框架。
无论如何,我有两个具体问题:
- 堆栈地图框架有什么作用?
- 第一个堆栈地图框是如何创建的?
和一个一般性问题:
- 有人可以提供比 JVMS 中给出的解释更简洁、更容易理解的解释吗?
c++ - C++ 和 Swift:如何在 C++ 堆栈帧中处理结构?结构继承的复杂性为什么 Swift 不支持结构继承?
在最近的一次开发者会议上,简要讨论了 Swift中的继承struct
(或者更准确地说是 Swift 中缺乏继承)的主题。struct
我假设 Swift 不支持struct
继承的原因是:
struct
s 是值类型- 值类型在堆栈帧之间复制
- 继承意味着 a 的大小
struct
可能会有所不同(例如,如果Lorry
继承自Vehicle
并Lorry
添加.weightCapacity
thenLorry
将需要比 更多的空间Vehicle
) - 具有大小在编译时未知的值类型参数会使调用者的堆栈帧构造和访问被调用者的数据复杂化
我认为正是由于这些复杂性,可能会给每个涉及 a 的函数调用添加额外的操作,struct
从而降低性能,Swift 不允许struct
继承。这个推理正确吗?
但后来我想到了 C++。C++ 确实允许struct
继承,并且 C++ 非常注重性能。这让我觉得我对 Swift 不允许struct
继承的推理是错误的。C++ 如何在struct
不影响性能的情况下实现继承?
gdb - 调用函数时 EBP 会发生什么
这是程序:
来自 GDB:
来自 GDB,为什么 EBP 与 main() 中的 ESP 的值不同?不应该mov ebp, esp
使 EBP ==0xffffcf88
吗?我认为这会将 EBP 设置为 ESP。
编辑:
我想我可能已经回答了我自己的问题。请纠正我。当返回地址和保存的帧指针被压入堆栈时,ESP 被移动。
该ESP
值0xffffcf88
在两个值(均为 4 个字节)被推入堆栈之前。之后,它的值为0xffffcf88 - 0x8
== 0xffffcf80
。这就是 EBP 的当前值。然后 ESP -= 0x10。
ESP的值是如何修改的?是这样的mov ESP, ESP - 0x8
吗?