考虑以下 Java 片段:
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
会影响性能吗?
我可以
部分地回答(2),至少就 OpenJDK 1.6.0b22 JVM 而言。我执行了一个简单的基准测试,在定时紧密循环中对 null
进行了多次分配。我无法检测到任何一致的性能差异,无论是哪种方式。
也就是说,我的基准测试非常简单,任何半点优化器都可能使其毫无用处,因此它可能并不代表现实世界的应用程序。我希望 JVM 会总是
优化该checkcast
操作码,但情况可能并非如此。
null
任何像样的 JIT 都会优化检查(它实际上是无操作),因此最大的成本是指令占用的三个字节。
ClassCastException
它可能与 javac 中的一个已知错误有关: