Maison  >  Questions et réponses  >  le corps du texte

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

PHPzPHPz2712 Il y a quelques jours1264

répondre à tous(3)je répondrai

  • PHP中文网

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

    Si vous changez le code en

    public static int add(int a,int b){
            int c=0;
            return a+b;
        }

    Alors la commande correspondante est :

           0: iconst_0
           1: istore_2
           2: iload_0
           3: iload_1
           4: iadd
           5: ireturn

    Le compilateur est généré selon le code. Si vous directement return a + b, il n'y aura pas de cinquième et sixième étapes supplémentaires.

    répondre
    0
  • 黄舟

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

    La bonne réponse à l'étage, en fait, vous pouvez clairement voir la raison en regardant le code.

    Tout d'abord, cette méthode est une méthode statique, donc les variables correspondant au tableau de variables locales [0] [1] [2] sont respectivement a, b, c

    ;
    0: iconst_0        //常量0入栈
    1: istore_2        //将栈顶出栈,即c=0;
    2: iload_0         //复制a变量的值入栈
    3: iload_1         //复制b变量的值入栈
    4: iadd            //将栈顶两个元素出栈,做加法,然后把结果再入栈(即a,b出栈,将a+b入栈)
    5: istore_2        //栈顶元素出栈,即c=和;  此时栈为空
    6: iload_2         //将c赋值压入栈
    7: ireturn         //返回栈顶元素
    
    

    répondre
    0
  • 伊谢尔伦

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

    Une petite erreur, l'index de la table des variables locales part de 0.

    Le bytecode généré par le compilateur est généré entièrement selon la sémantique de la méthode sans grande optimisation.

    L'instruction

    iadd correspond à l'opération d'addition dans a+b Le istore_2 suivant correspond à l'opération d'affectation de c=, qui consiste à l'enregistrer dans la table des variables locales. Le iload_2 suivant correspond. à returnObtenir la valeur de c.

    répondre
    0
  • Annulerrépondre