首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在Java中,++x比x++更有效吗?

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

Stack Overflow用户
提问于 2012-09-13 06:01:06
回答 3查看 2.3K关注 0票数 16

在编程课上,教授教我们关于x++++x的知识,其中x是一个整数。

他说,在这种情况下,我们可以只使用x++++x++x更有效(虽然有点,但在理论上仍然更有效)。

,但是我忘了为什么。有人知道吗?这是用Java实现的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-13 06:02:24

这在Java中并不是更高效。在可以重载增量/减量运算符的语言中,它可以更有效,但在其他情况下,性能完全相同。

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

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

就像上面注释中的pst一样,我从不使用x++++x的返回值,如果您从来没有使用过这两个返回值,那么您可能应该坚持使用您喜欢的返回值。

票数 25
EN

Stack Overflow用户

发布于 2012-09-13 06:46:39

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

此程序:

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编译了你的那部分代码,那么所有的赌注都失效了。例如,上面的代码可以编译为no-op,因为它没有副作用。

票数 16
EN

Stack Overflow用户

发布于 2012-09-13 07:29:22

问题的真相是,在PDP-11上,甚至在VAX上,*x++在C上比*++x快,因为它编译成单条指令(自动递增寄存器延迟)。同样,*--x*x--更快。如果编译器仍然生成该指令,则使用不带解引用的任何一种形式只会在一种情况下比在另一种情况下更快,这将是浪费的,因为仍然会发生解引用。

那些日子已经一去不复返了。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12396740

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档