gpt4 book ai didi

java - INVOKESTATIC 操作是否会反转堆栈顺序?

转载 作者:行者123 更新时间:2023-12-01 07:30:19 25 4
gpt4 key购买 nike

我正在研究 Java 字节码,当时我注意到简单的表达式 Math.max(0,1) 被转换为以下字节码指令。

ICONST_0, 
ICONST_1,
INVOKESTATIC(java/lang/Math.max)

我的问题是,如果java使用后进先出堆栈,这意味着1现在将位于堆栈上0的前面,这意味着虚拟机必须反转堆栈上项目的顺序。调用 max 指令来获取 1 之前的 0。但是在规范中,它说注意到这一点,我的假设是否正确。

最佳答案

参数堆栈只是一个抽象。当一个操作接受 n 个参数时,前 n 个参数将从堆栈中取出并从下到上使用,正如您所观察到的。这不仅适用于 invokestatic,也适用于每条字节码指令。

例如以下序列

iconst_0图标t_1图标t_2isub

将 0、1 和 2 压入堆栈。 isub 指令弹出顶部两个值 1 和 2,并从下到上使用它们,因此结果为 1-2 = -1。因此,最终结果是一个包含0、-1的堆栈。

如果您对此类细节感兴趣,您应该尝试阅读 JVM 规范。

关于java - INVOKESTATIC 操作是否会反转堆栈顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18424833/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com