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

问题描述 投票:0回答:2

给出以下代码:

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 的强制转换,以便这种“手动重载决策”不会产生性能开销?或者实际运行时执行仍会执行强制转换吗?

java optimization overloading
2个回答
4
投票

该调用是在“编译”时选择的。因此,与其说这是一种优化,不如说是编译器本身选择调用哪个方法。转换是为了帮助编译器,不会影响运行时性能。 这与覆盖不同,在覆盖中,被调用的对象在运行时指示方法,例如

shape.getArea(); // determined by whether shape is a square, circle etc.

如果您在使用/不使用强制转换的情况下编写上述内容并生成字节码(
javap -verbose -c C

),您将在生成的代码中看到这种差异:


< 2: invokestatic #7; //Method m:(Ljava/lang/Object;)V --- > 2: invokestatic #7; //Method m:(Ljava/lang/String;)V

即编译器只是选择了不同的方法(
const #7

在每种情况下都会改变以反映不同的方法)。

    


1
投票

实际上来说:为什么不开发一个同时运行强制转换和直接调用的基准应用程序,看看在几百万次迭代后是否有任何差异?

© www.soinside.com 2019 - 2024. All rights reserved.