首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java是方法末尾始终为空的操作数堆栈。

问Java是方法末尾始终为空的操作数堆栈。
EN

Stack Overflow用户
提问于 2016-06-27 16:04:47
回答 3查看 560关注 0票数 3

在Java中,在方法的末尾,当它返回时,操作数堆栈只包含返回值(或者对void方法为空)。或者,在返回值下是否还有其他需要在堆栈中丢弃的值?

我正在标准C堆栈上创建每个方法框架。如图所示:

​

​

如您所见,调用方中的操作数堆栈成为被调用方帧中的args。在被调用的框架中,在还原保存的寄存器之前,操作数堆栈上是否会有“垃圾”(返回值除外)需要清理?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-06-27 17:49:59

请参阅return的文档

操作数堆栈 .→空着 描述 …如果不抛出异常,则丢弃当前帧的操作数堆栈上的任何值(§2.6)。

或ireturn,分别:

操作数堆栈 ,值→为空 描述 …如果没有异常抛出,则从当前帧的操作数堆栈(§2.6)中弹出值,并将其推送到调用方帧的操作数堆栈中。当前方法的操作数堆栈上的任何其他值都将被丢弃。

我认为,这给出了足够的提示,即操作数堆栈上可能存在必须“丢弃”的值,尽管在典型的实现中,不需要采取任何行动,因为丢弃堆栈帧作为一个整体意味着丢弃操作数堆栈。

我不知道为什么这对你是个障碍。如果您真的想通过使用当前操作数堆栈位置来获得堆栈帧的开头,那么无论如何您都需要有关堆栈帧的元信息,即您必须知道该帧中局部变量的数量。检索此信息并计算堆栈帧开始,不能比首先检索帧的开始更便宜。

票数 3
EN

Stack Overflow用户

发布于 2016-06-27 16:40:08

部分回答:操作数堆栈是框架的一部分:

每个帧(§2.6)都包含一个称为操作数堆栈的LIFO堆栈.

和框架创建/销毁对应于方法调用/完成

每次调用方法时都会创建一个新框架。一个框架在其方法调用完成时被破坏,不管该完成是正常的还是突然的(它抛出了一个未提及的异常)。

当一个方法返回时,这并没有给出对操作数堆栈的深入了解,但至少它回答了您关于需要清理操作数堆栈的问题:因为它是帧本地的,所以不需要清理操作数堆栈,因为操作数堆栈和它的帧一起被丢弃了。

票数 1
EN

Stack Overflow用户

发布于 2016-06-27 16:28:56

这个问题很难最终回答,因为你没有明确说明你要问的是什么。

规范是公开可用的https://docs.oracle.com/javase/specs/jvms/se8/jvms8.pdf (见第2.6.2章)

这表示堆栈可能处于任意状态,至少在发生未察觉的异常时是这样。我没有看到返回值的明确提及,但是由于指定返回字节码从堆栈值返回值,所以返回字节码必须在堆栈上(第3.5章)。

规范只是对逻辑上发生的事情的描述。真正的VM不需要将规范1:1转换为内存布局--它只需要确保得到的逻辑是相同的(想想JIT的代码)。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38058539

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档