【发布时间】:2014-09-14 01:59:01
【问题描述】:
我正在使用此代码进行测试:
public class TestNull {
public void leftComparison(String s) {
if (s == null);
}
public void rightComparison(String s) {
if (null == s);
}
}
我用javac 1.8.0_05编译它,然后检查字节码:
public class TestNull {
....
public void leftComparison(java.lang.String);
Code:
0: aload_1
1: ifnonnull 4
4: return
public void rightComparison(java.lang.String);
Code:
0: aconst_null
1: aload_1
2: if_acmpne 5
5: return
}
显然,leftComparison 被编译为在堆栈上推送和弹出 1 个变量,而 rightComparison 推送和弹出 2。我推测 leftComparison 因此比 rightComparison 更有效?
我想知道为什么编译器不重写rightComparison的代码?在我看来,这两个比较在语义上应该是等价的,对吧?
【问题讨论】:
-
如果编译器将您的代码重写为更简单但等效的代码,它根本不会生成字节码,因为这些方法什么都不做。 :-)
-
因为没有
ifnots字节码。 javac 翻译事物的方式非常直接。
标签: java compiler-construction compiler-optimization