有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java分析各种增量运算符与赋值和增量运算符

不久前有人问Is the ++ operator more efficient than a=a+1?。我想我之前分析过这一点,最初说a = a + 1和增量运算符++之间没有区别。事实证明,a++++aa += 1都编译成相同的字节码,但a = a + 1确实而不是,如下所示:

public class SO_Test
{
    public static void main(String[] args)
    {
        int a = 1;
        a++;
        a += 1;
        ++a;    
    }
}

输出: enter image description here

例如:

public class SO_Test
{
    public static void main(String[] args)
    {
        int a = 1;
        a = a + 1;
        a++;
        a += 1;
        ++a;    
    }
}

输出: enter image description here

简而言之,a = a + 1发布iload_1iconst_1iaddistore_1,而其他的只使用iinc

我试着让这合理化,但我做不到。在这种情况下,编译器的智能是否足以优化字节码?这些不同有什么好的理由吗?这是由JIT处理的吗?除非我的理解有误,否则我似乎永远不应该使用a = a + 1,我确信这只是一种文体选择


共 (1) 个答案

  1. # 1 楼答案

    值得注意的是,这是特定于编译器的。我发现至少有一个eclipse版本以与x++相同的方式编译x=x+1。此外,这只与局部变量有关,因为字段没有类似的字节码指令。它只适用于int类型的变量。因此字节码的影响相当有限。这很可能改善了常见的for(int i=start; i<limit; i++)模式。在语言方面,尤其是对a[b()] ++a[b()] = a[b()] + 1等而言,它产生了影响