美文网首页
重学 i++ 和++i

重学 i++ 和++i

作者: fyg | 来源:发表于2022-08-16 10:34 被阅读0次
    
    public void calc(){
            int i = 1;
            i = i++;
            System.out.println(i);
        }
    
    对应的字节码指令如下:
    
    calc:()V
    000:    iconst_1                                {Lsample/HelloWorld;, .} | {}
    001:    istore_1                                {Lsample/HelloWorld;, .} | {I}
    002:    iload_1                                 {Lsample/HelloWorld;, I} | {}
    003:    iinc 1 1                                {Lsample/HelloWorld;, I} | {I}
    004:    istore_1                                {Lsample/HelloWorld;, I} | {I}
    005:    getstatic System.out                    {Lsample/HelloWorld;, I} | {}
    006:    iload_1                                 {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;}
    007:    invokevirtual PrintStream.println       {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;, I}
    008:    return                                  {Lsample/HelloWorld;, I} | {}
    
    
    
    public void calc(){
            int i = 1;
            i = ++i;
            System.out.println(i);
        }
    
    
    对应的字节码指令如下:
    
    calc:()V
    000:    iconst_1                                {Lsample/HelloWorld;, .} | {}
    001:    istore_1                                {Lsample/HelloWorld;, .} | {I}
    002:    iinc 1 1                                {Lsample/HelloWorld;, I} | {}
    003:    iload_1                                 {Lsample/HelloWorld;, I} | {}
    004:    istore_1                                {Lsample/HelloWorld;, I} | {I}
    005:    getstatic System.out                    {Lsample/HelloWorld;, I} | {}
    006:    iload_1                                 {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;}
    007:    invokevirtual PrintStream.println       {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;, I}
    008:    return                                  {Lsample/HelloWorld;, I} | {}
    
    iload istore image.png iinc.png

    指定包名,统计方法耗时

    
    //代码
    
    public void calc(){
            int i = 1;
            i = i++;
            System.out.println(i);
        }
    
    //对应的字节码指令如下
    calc:()V
    000:    iconst_1                                {Lsample/HelloWorld;, .} | {I}
    001:    istore_1                                {Lsample/HelloWorld;, I} | {}
    002:    iload_1                                 {Lsample/HelloWorld;, I} | {I} //把局部变量表索引为1位置的值   放到操作数栈中  (操作数栈顶元素的值为 1)
    003:    iinc 1 1                                {Lsample/HelloWorld;, I} | {I} //把局部变量表索引为1位置的值加1  (局部变量表该位置的值 i=2)
    //栈顶元素弹栈并把值(栈顶元素的值为1)存到局部变量表索引为1的位置(局部变量表索引为1位置的值由2变为1)
    004:    istore_1                                {Lsample/HelloWorld;, I} | {}  
    005:    getstatic System.out                    {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;} 
    006:    iload_1                                 {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;, I}
    007:    invokevirtual PrintStream.println       {Lsample/HelloWorld;, I} | {}
    008:    return                                  
    
    
    
    
    
    
    
    //代码
    
    public void calc(){
            int i = 1;
            i = ++i;
            System.out.println(i);
        }
    //对应的字节码指令如下
    calc:()V
    000:    iconst_1                                {Lsample/HelloWorld;, .} | {I}
    001:    istore_1                                {Lsample/HelloWorld;, I} | {}  
    002:    iinc 1 1                                {Lsample/HelloWorld;, I} | {} //把局部变量表索引为1位置的值加1 (i = 2)
    003:    iload_1                                 {Lsample/HelloWorld;, I} | {I}//把局部变量表索引为1位置的值放到操作数栈中(栈顶元素值为2)
    //栈顶元素弹栈并把值(栈顶元素的值为2)存到局部变量表索引为1的位置(局部变量表索引为1位置的值由1变为2)
    004:    istore_1                                {Lsample/HelloWorld;, I} | {}
    005:    getstatic System.out                    {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;}
    006:    iload_1                                 {Lsample/HelloWorld;, I} | {Ljava/io/PrintStream;, I}
    007:    invokevirtual PrintStream.println       {Lsample/HelloWorld;, I} | {}
    008:    return                                  
    
    
    
    

    相关文章

      网友评论

          本文标题:重学 i++ 和++i

          本文链接:https://www.haomeiwen.com/subject/rbergrtx.html