Java编译器是否应用了一些转换来优化方法调用?还是它总是通过简单的优化(比如删除死代码)来生成源代码的忠实表示?
具体而言,如果我们有以下示例:
public static void main(String[] args) {
System.out.println(foo());
System.out.println(foo());
System.out.println(foo());
System.out.println(bar());
System.out.println(bar());
System.out.println(bar());
}
public static int foo() {
int[] arr = {1, 2, 3, 4};
return arr[0];
}
public static int bar() {
return 10;
}编译器是否尝试将对bar的调用(甚至可能是foo)替换为打印整数10的调用
public static void main(String[] args) {
System.out.println(1);
System.out.println(1);
System.out.println(1);
System.out.println(10);
System.out.println(10);
System.out.println(10);
}我知道一个名为内联的方法,它可以导致这样的转换,但是我想知道是Java编译器(至少是Oracle的javac )应用了它,还是它总是被推迟到JVM。
发布于 2014-10-22 20:11:23
这种类型的优化称为http://en.wikipedia.org/wiki/Constant_folding。
Java规范允许那些不影响程序可观察结果的优化(和其他优化)。
然而,给定的编译器是否真正执行这些优化完全取决于实现。
https://stackoverflow.com/questions/26516091
复制相似问题