首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >jvm指令用例

jvm指令用例
EN

Stack Overflow用户
提问于 2019-02-20 07:49:55
回答 2查看 1.5K关注 0票数 7

Java字节码指令集提供各种形式的dup教学。我很难理解这些指令和swap指令是如何有用的。在编译这些指令时,哪个java代码会产生字节码?

EN

回答 2

Stack Overflow用户

发布于 2019-02-20 23:32:56

我不知道javac何时使用它,但是当我们生成代码时,我们经常使用DUP和交换。例如,如果您所做的相当于

代码语言:javascript
运行
复制
x.setCharm(y);
x.setSpin(z);

然后加载x,然后立即加载DUP,因为调用第一个方法会将其从堆栈中删除,并且您希望使用它两次。

当你做这样的事情时,交换就很方便了

代码语言:javascript
运行
复制
y = x.getCharm();
z.setCharm(y);

如果第一条指令将y留在堆栈的顶部,那么堆栈z,然后交换,所以现在在堆栈上有了正确的值来调用第二条指令。

票数 3
EN

Stack Overflow用户

发布于 2020-06-07 01:50:36

dup的另一个常见用例是数组初始化。

考虑一下代码int[] a = new int[] {1, 2, 3}

最后一层指令将整数存储到数组中。它需要堆栈上的三个值:对数组的引用、该数组中的索引和要存储的值,关键是,在调用它之后,它会弹出所有三个值:

数组、索引和值从操作数堆栈中弹出。Java虚拟机规范

将上述示例转换为字节代码的简单方法如下所示:

代码语言:javascript
运行
复制
iconst_3
newarray       int
iconst_0               # array index
iconst_1               # value
iastore                # a[0] = 1
aload_1                # load array ref again
iconst_1
iconst_2
iastore                # a[1] = 2
aload_1                # load array ref yet again
iconst_2
iconst_3
iastore                # a[2] = 3
...
astore_1

注意,对数组的引用将为每个iastore指令重新加载。

使用dup可以避免这种情况。在将索引和值推到堆栈之前,我们重复堆栈上的数组引用,这使得底部条目在那里被重新用于下一个iastore指令:

代码语言:javascript
运行
复制
iconst_3
newarray       int
dup
iconst_0
iconst_1
iastore                # a[0] = 1
dup
iconst_1
iconst_2
iastore                # a[1] = 2
dup
iconst_2
iconst_3
iastore                # a[2] = 3
...
astore_1
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54781284

复制
相关文章

相似问题

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