【发布时间】:2016-05-24 21:19:16
【问题描述】:
我有一个简单的类用于说明目的:
public class Test {
public int test1() {
int result = 100;
result = 200;
return result;
}
public int test2() {
return 200;
}
}
编译器生成的字节码(由javap -c Test.class检查)如下:
public int test1();
Code:
0: bipush 100
2: istore_1
3: sipush 200
6: istore_1
7: iload_1
8: ireturn
public int test2();
Code:
0: sipush 200
3: ireturn
为什么编译器没有将test1 方法优化为为test2 方法生成的相同字节码?我希望它至少可以避免 result 变量的冗余初始化,因为很容易得出结论:根本没有使用值 100。
我在 Eclipse 编译器和 javac 中都观察到了这一点。
javac 版本:1.8.0_72,作为 JDK 的一部分与 Java 一起安装:
Java(TM) SE Runtime Environment (build 1.8.0_72-b15)
Java HotSpot(TM) 64-Bit Server VM (build 25.72-b15, mixed mode)
【问题讨论】:
-
Java 语言规范 不需要像这样的任何优化,因此将“编译器”说成只有一个是没有意义的。你应该指出你正在使用什么编译器。
-
经典答案是在 JVM 中完成优化 (stackoverflow.com/questions/5981460/…)
-
@ruakh 好话;添加了编译器信息。
-
但是权威的答案会很好,我会悬赏原始问题,我们会看看会发生什么。
-
@PeterLawrey 虽然没有明确写下来,但编译器必须对常量表达式进行优化,以使字节码在适合类文件格式的同时遵守 JLS。
标签: java javac bytecode compiler-optimization