찾다

 >  Q&A  >  본문

java - 怎么理解JVM中的iload和istore指令

我最近在学习JVM,被istore和iload两条指令困扰了。
以下是我查看《Java虚拟机规范》得到的解释

下面是我的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到操作数栈上。
不知道,是不是我哪步理解错了,谢谢指点。

PHPzPHPz2787일 전1321

모든 응답(3)나는 대답할 것이다

  • PHP中文网

    PHP中文网2017-04-18 10:51:52

    코드를

    로 변경하면 으아아아

    그러면 해당 명령은 다음과 같습니다.

    으아아아

    코드에 따라 컴파일러가 생성됩니다. return a + b 추가 5, 6단계는 없습니다.

    회신하다
    0
  • 黄舟

    黄舟2017-04-18 10:51:52

    정답은 위에 있습니다. 사실 코드를 보면 그 이유를 확실히 알 수 있습니다.

    우선 이 메서드는 정적 메서드이므로 지역 변수 배열 [0] [1] [2]에 해당하는 변수는 각각 a, b, c입니다. 으아아아

    회신하다
    0
  • 伊谢尔伦

    伊谢尔伦2017-04-18 10:51:52

    작은 실수는 지역변수 테이블의 인덱스가 0부터 시작한다는 것입니다.

    컴파일러에 의해 생성된 바이트코드는 별다른 최적화 없이 메소드의 의미에 따라 완전히 생성됩니다.

    iadd 명령어는 a+b의 추가 연산에 해당합니다. 다음 istore_2은 이를 지역 변수 테이블에 저장하는 c=의 할당 연산에 해당합니다. iload_2c의 값을 구합니다. return

    회신하다
    0
  • 취소회신하다