在Java中,++ x比x ++更有效吗?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (20)

在编程类,教授教我们关于x++++x,其中x是一个整数。

他说,在方案中,我们可以只是把两种x++++x++x是更有效的(一点,但还是在理论上,更高效尽管如此)。

但我忘记了为什么。有谁知道?这是与Java。

提问于
用户回答回答于

在Java中它不是更高效。在增量/减量运算符可能超负荷的语言中它可以更有效,但否则性能完全相同。

之间的差x++++xx++返回的值x 它被递增之前,和++x返回的值x它被递增后。就代码生成而言,两者都可以弥补完全相同数量的指令,至少当你可以互换使用时(如果你不能交替使用它们,你不应该担心哪一个更快,你应该是选择你需要的那个)。唯一的区别是放置增量指令的地方。

在C ++中,类可以重载prefix(++x)和postfix(x++)运算符。当处理重载它们的类型时,使用前缀运算符几乎普遍更快,因为后缀运算符的语义会像增量之前一样返回对象的副本,即使不使用它时也是如此前缀运算符可以简单地返回对修改对象的引用(并且上帝知道C ++开发人员更愿意返回引用而不是副本)。这可能是一个++x优先考虑的理由x++:如果你习惯于使用++x 你,那么当你/如果切换到C ++时,你可以节省一些性能上的麻烦。但仅在Java环境下,两者完全等价。

就像上面评论中的pst一样,我从来没有使用x++or 的返回值++x,并且如果你从未这样做,你应该坚持你喜欢的。

用户回答回答于

出于好奇,你可以检查生成的字节码。

这个程序:

public static void main(String args[]) {
    int i = 1; //bytecode 0, 1
    i++; //bytecode 2
    ++i; //bytecode 5
    int a = ++i; //bytecode 8, 11, 12
    int b = i++; //bytecode 13, 14, 17
}

生成以下字节码:

  public static void main(java.lang.String[]);
    Code:
       0: iconst_1
       1: istore_1
       2: iinc          1, 1
       5: iinc          1, 1
       8: iinc          1, 1
      11: iload_1
      12: istore_2
      13: iload_1
      14: iinc          1, 1
      17: istore_3
      18: return

所以你可以看到,从字节码的角度来看,前后修复操作符是完全相同的(除了操作的顺序)。

如果当JIT编译你的代码的一部分,所有的投注都关闭。例如,上面的代码可以被编译为无操作,因为它没有副作用。

扫码关注云+社区