Vol*_*ort 16 java pre-increment post-increment
在编程类,教授教我们关于x++和++x,其中x是一个整数.
他说,在方案中,我们可以只是把两种x++或++x,++x是更有效的(一点,但还是在理论上,更高效尽管如此).
但我忘记了原因.有谁知道?这是Java.
zne*_*eak 25
它在Java中效率不高.在递增/递减运算符可能过载的语言中,它可以更有效,但其他方面的性能完全相同.
x++和之间的差异++x是x++返回x 增加之前的值,并++x返回x增加之后的值.在代码生成方面,两者都弥补了完全相同数量的指令,至少当你可以互换使用时(如果你不能互换使用它们,你不应该担心哪一个更快,你应该是选择你需要的那个).唯一的区别是放置增量指令的位置.
在C++中,类可以重载prefix(++x)和postfix(x++)运算符.当处理重载它们的类型时,使用前缀运算符几乎普遍更快,因为后缀运算符的语义将返回对象的副本,就像它在增量之前一样,即使你不使用它,前缀运算符可以简单地返回对修改对象的引用(并且上帝知道C++开发人员更喜欢返回引用而不是副本).这可能是一个值得考虑++x优势的理由x++:如果你养成了使用习惯,++x 那么当你切换到C++时,你可以省去一些轻微的性能问题.但仅在Java的上下文中,两者都是绝对等价的.
就像上面评论中的pst一样,我从不使用x++或的返回值++x,如果你从未使用过,那么你应该坚持使用你喜欢的那个.
ass*_*ias 16
出于好奇,您可以检查生成的字节码.
这个程序:
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
}
Run Code Online (Sandbox Code Playgroud)
生成以下字节码:
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
Run Code Online (Sandbox Code Playgroud)
因此,您可以看到,从字节码角度(除了操作的顺序),前置和后置修复操作符严格相同.
如果JIT编译了你的代码部分,那么所有的赌注都会被取消.例如,上面的代码可以编译为无操作,因为它没有副作用.