考虑以下 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
会影响性能吗?这是否可以被视为 Eclipse Java 编译器中的错误?
注意:
我可以部分回答(2),至少就 OpenJDK 1.6.0b22 JVM 而言。我执行了一个简单的基准测试,在定时紧密循环中对 null
进行了多次赋值。我无法检测到任何一致的性能差异,无论是哪种方式。
也就是说,我的基准测试非常简单,任何半点优化器都可能使其毫无用处,因此它可能并不代表现实世界的应用程序。我希望 JVM 总是优化该 checkcast
操作码,但情况可能并非如此。
最佳答案
关于你的第一个问题,你是对的,那里的 checkcast 指令是多余的。 根据Sun's Java Hotspot wiki空检查和实例检查很便宜。
我打开了一个 issue in Eclipse Bugzilla从 Eclipse 编译器团队获得反馈,但正如之前指出的,这是多余的,但无害的检查。它仅影响字节码大小,Java HotSpot 编译器可能会在运行时应用类型检查优化。
更新:from Eclipse compiler team这似乎是 another old bug 的副作用.
关于java - 为什么 Eclipse Java 编译器检查 null 类型转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7586872/