[英]Will the Java compiler optimize away casts for manual overload resolution?
给出以下代码:
class C {
static void m(String s) { ... } // 1
static void m(Object o) { ... } // 2
public static void main(String[] args) {
m( (Object) "test"); // call m version 2
}
}
Java编译器是否会优化对Object i main的强制转换,以便这种“手动重载解析”不会导致性能开销? 还是实际的运行时执行仍会执行强制转换?
该调用在编译时选择。 因此,它不是优化,而是编译器自己选择要调用的方法。 强制转换在那里可以帮助编译器,并且不会影响运行时性能。
这与覆盖不同,在覆盖中,被调用的对象在运行时指定了方法,例如
shape.getArea(); // determined by whether shape is a square, circle etc.
如果使用/不使用javap -verbose -c C
编写以上代码并生成字节码( javap -verbose -c C
),则会在生成的代码中看到以下差异:
< 2: invokestatic #7; //Method m:(Ljava/lang/Object;)V
---
> 2: invokestatic #7; //Method m:(Ljava/lang/String;)V
也就是说,编译器只是选择了一个不同的方法( const #7
在每种情况下都会发生变化以反映该不同的方法)。
您担心多少性能下降? 我对您的情况感到好奇,以为您认为这可能会产生任何明显的影响,因为一百年来我永远不会担心这会降低我的应用程序的速度?
从实践上讲:为什么不开发同时运行强制转换和直接调用的基准应用程序,看看在数百万次迭代中是否有任何区别?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.