繁体   English   中英

Java编译器会优化手动转换以解决强制重载吗?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM