Java字节码指令集提供各种形式的dup教学。我很难理解这些指令和swap指令是如何有用的。在编译这些指令时,哪个java代码会产生字节码?
发布于 2019-02-20 23:32:56
我不知道javac何时使用它,但是当我们生成代码时,我们经常使用DUP和交换。例如,如果您所做的相当于
x.setCharm(y);
x.setSpin(z);然后加载x,然后立即加载DUP,因为调用第一个方法会将其从堆栈中删除,并且您希望使用它两次。
当你做这样的事情时,交换就很方便了
y = x.getCharm();
z.setCharm(y);如果第一条指令将y留在堆栈的顶部,那么堆栈z,然后交换,所以现在在堆栈上有了正确的值来调用第二条指令。
发布于 2020-06-07 01:50:36
dup的另一个常见用例是数组初始化。
考虑一下代码int[] a = new int[] {1, 2, 3}。
最后一层指令将整数存储到数组中。它需要堆栈上的三个值:对数组的引用、该数组中的索引和要存储的值,关键是,在调用它之后,它会弹出所有三个值:
数组、索引和值从操作数堆栈中弹出。Java虚拟机规范
将上述示例转换为字节代码的简单方法如下所示:
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指令:
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_1https://stackoverflow.com/questions/54781284
复制相似问题