jvm 为什么Java生成的字节码包括推栈和立即弹出栈的操作?

kzmpq1sx  于 5个月前  发布在  Java
关注(0)|答案(1)|浏览(53)

这里有一个例子

public Integer add(Integer a) {
    a++;
    return a;
}

字符串
此方法的相应字节码指令如下所示

0 aload_1
 1 astore_2
 2 aload_1
 3 invokevirtual #62 <java/lang/Integer.intValue : ()I>
 6 iconst_1
 7 iadd
 8 invokestatic #52 <java/lang/Integer.valueOf : (I)Ljava/lang/Integer;>
11 astore_1
12 aload_2
13 pop
14 aload_1
15 areturn


在第12-13行中,您可以观察到它执行了一个压入堆栈的操作,然后执行了一个立即弹出操作。
我想知道为什么要这样设计它,为什么它需要另一个“a”到LocalVariableTable的副本

ryevplcw

ryevplcw1#

因为a++a = a + 1的简写,在返回变量之前需要重新赋值。看看字节码中的以下代码:

public Integer add2(Integer a) {
    return a+1;
}

字符串

相关问题