为什么Java生成的字节码包含入栈和立即出栈的操作?

问题描述 投票:0回答:1

这是一个例子

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

java jvm
1个回答
0
投票

因为

a++
a = a + 1
的简写符号,并且您在返回变量之前重新分配变量。看一下字节码中的以下代码:

public Integer add2(Integer a) {
    return a+1;
}
© www.soinside.com 2019 - 2024. All rights reserved.