【发布时间】:2011-09-28 17:03:15
【问题描述】:
考虑以下 Java sn-p:
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 操作码,但情况可能并非如此。
【问题讨论】:
标签: java eclipse compiler-construction null bytecode