我最近在学习JVM,被istore和iload两条指令困扰了。
以下是我查看《Java虚拟机规范》得到的解释
将一个局部变量加载到操纵栈的指令包括:iload、iload_、lload…
将一个数值从操作数栈存储到局部变量表的指令包括:istore、istore_、lstore…
下面是我的java代码
public static int add(int a,int b){ int c=0; c=a+b; return c; }
下面是编译后的字节码,也加上了我的理解,如果解释不恰当,谢谢指出
0: iconst_0 //常量0压入操作数栈
1: istore_2 //弹出操作数栈栈顶元素,保存到局部变量表第2个位置
2: iload_0 //第0个变量压入操作数栈
3: iload_1 //第1个变量压入操作数栈
4: iadd //操作数栈中的前两个int相加,并将结果压入操作数栈顶
5: istore_2 //弹出操作数栈栈顶元素,保存到局部变量表第2个位置
6: iload_2 //加载局部变量表的第2个变量到操作数栈顶
7: ireturn //返回
从上面字节码的分析看,指令4已经将计算结果压入到操作数栈了,而指令6又是把结果压入到操作数栈,这不是重复工作吗。
如果存入操作数栈的意义是为了可以store到局部变量表中,那第6步又为什么要load到操作数栈上。
不知道,是不是我哪步理解错了,谢谢指点。
HUWWW
摇曳的蔷薇