++ x比Java中的x ++更有效吗?

在编程课程中,教授教我们x++++x ,x是整数。

他说,在这种情况下,我们可以放置x++++x++x更有效(虽然很少,但理论上仍然更有效)。

但我忘记了原因 。 有谁知道? 这是Java。

它在Java中效率不高。 在递增/递减运算符可能过载的语言中,它可以更有效,但其他方面的性能完全相同。

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

在C ++中,类可以重载前缀( ++x )和后缀( x++ )运算符。 当处理重载它们的类型时,使用前缀运算符几乎普遍更快,因为后缀运算符的语义将返回对象的副本,就像它在增量之前一样,即使你不使用它,前缀运算符可以简单地返回对修改对象的引用(并且上帝知道C ++开发人员更喜欢返回引用而不是副本)。 这可能是考虑++x优于x++一个原因:如果你养成使用++x的习惯,当你/切换到C ++时,可以节省一些轻微的性能问题。 但仅在Java的上下文中,两者都是绝对等价的。

与上面的注释中的pst非常相似,我从不使用x++++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编译代码的那部分,那么所有的赌注都会被取消。 例如,上面的代码可以编译为无操作,因为它没有副作用。

问题的真相是,在PDP-11上, *x++C中的 *++x可能是VAX,因为它编译为单个指令(自动递增寄存器延迟)。 同样地, *--x*x--快。 如果编译器仍然生成该指令,则使用没有解除引用的任一forms只会在一种情况下更快而不是另一种forms,这将是浪费因为仍然会发生取消引用。

那些日子已经一去不回。