我最近在学习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到操作数栈上。
不知道,是不是我哪步理解错了,谢谢指点。
Jika anda menukar kod kepada
Maka arahan yang sepadan ialah:
Pengkompil dijana mengikut kod Jika anda terus
return a + b
, tidak akan ada langkah kelima dan keenam tambahan.Jawapan yang betul adalah di tingkat atas, sebenarnya, jika anda melihat kod, anda boleh melihat dengan jelas sebabnya.
Pertama sekali, kaedah ini ialah kaedah statik, jadi pembolehubah yang sepadan dengan tatasusunan pembolehubah tempatan [0] [1] [2] masing-masing ialah a, b, c
Satu kesilapan kecil, indeks jadual pembolehubah tempatan bermula dari 0.
Kod bait yang dijana oleh pengkompil dijana sepenuhnya mengikut semantik dalam kaedah tanpa banyak pengoptimuman.
Arahaniadd
sepadan dengan operasi penambahan dalama+b
seterusnyaistore_2
sepadan dengan operasi tugasanc=
, iaitu untuk menyimpannya ke jadual pembolehubah setempatiload_2
berikut untukreturn
Dapatkan nilai c.