java - 怎么理解JVM中的iload和istore指令
PHPz
PHPz 2017-04-18 10:49:52
0
3
1317

我最近在学习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到操作数栈上。
不知道,是不是我哪步理解错了,谢谢指点。

PHPz
PHPz

学习是最好的投资!

全員に返信(3)
洪涛

コードを

に変更すると リーリー

対応するコマンドは次のとおりです:

リーリー

コードに従ってコンパイラが生成されます。return a + bを直接実行する場合、追加の手順 5 と 6 は必要ありません。

いいねを押す +0
黄舟

正解は 2 階です。実際、コードを見れば、その理由がはっきりとわかります。

まず、このメソッドは静的メソッドであるため、ローカル変数配列 [0] [1] [2] に対応する変数はそれぞれ a、b、c で​​す。 リーリー

いいねを押す +0
伊谢尔伦

ちょっとした間違いですが、ローカル変数テーブルのインデックスは0から始まります。

コンパイラーによって生成されるバイトコードは、あまり最適化されることなく、メソッドのセマンティクスに従って完全に生成されます。

iadd指令对应的a+b中加法操作,下一步的istore_2对应的就是c=的赋值操作,也就是保存到局部变量表,后面的iload_2对应的就是returnのcの値を取得します。

いいねを押す +0
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート