考虑下面的Java代码:为什么Eclipse Java编译器检查从null转换?
public class Test {
public static void use(Object[] x) {
}
public static void main(String[] args) {
Object[] x = null;
use(x);
}
}
由Eclipse 3.7编译器为main()
产生的Java字节码看起来是这样的:
public static void main(java.lang.String[]);
Code:
0: aconst_null
1: checkcast #20; //class "[Ljava/lang/Object;"
4: astore_1
5: aload_1
6: invokestatic #21; //Method use:([Ljava/lang/Object;)V
9: return
相反,这是由OpenJDK的1.6生成的字节码.0b22编译器:
public static void main(java.lang.String[]);
Code:
0: aconst_null
1: astore_1
2: aload_1
3: invokestatic #2; //Method use:([Ljava/lang/Object;)V
6: return
请注意,Eclipse编译器会发出额外的checkcast
操作码。它似乎也只是为数组而不是其他变量类型。
我的问题:
据我所知,
null
是分配给任何类,包括数组。是否任何感到checkcast
已知null
价值?是否额外
checkcast
影响性能?难道这被认为是Eclipse Java编译器中的一个错误吗?
注:
我可以部分答案(2),至少只要在OpenJDK 1.6.0b22 JVM而言。我执行了一个简单的基准测试,并在定时紧密循环中对null
进行了几项分配。这种或那种方式我无法检测到任何一致的性能差异。
这就是说,我的基准是非常简单,任何半体面的优化器将有可能使它无用的,所以它可能无法代表现实世界的应用程序。我希望JVM会总是优化了那个checkcast
操作码,但可能并非如此。
+1的错误报告和一个有趣的阅读... – thkala