4
int i = 10 + 20;

是不是编译器会处理这段代码,加上10 + 20,字节码和这行代码一样?

int i = 30;

我在哪里可以读到它?

4

3 回答 3

11

是的,您甚至可以自己验证。以一个小的 Java 文件为例:

public class Main {
  public Main() {
    int i = 10 + 20;
  }
}

用 编译javac Main.java,然后运行javap -c Main反汇编:

Compiled from "Main.java"
public class Main extends java.lang.Object{
public Main();
  Code:
   0:   aload_0
   1:   invokespecial   #1; //Method java/lang/Object."<init>":()V
   4:   bipush  30
   6:   istore_1
   7:   return

}

清晰的在字节码中,可以看到编译器的优化:bipush 30

于 2010-10-09T23:08:34.110 回答
6

是的。这种编译器优化称为常量折叠。还有另一种编译器优化称为稀疏条件常量传播,它做类似的事情。

一般来说,不能保证给定的编译器实际上会折叠常量,但现在几乎每种语言的每个编译器都会这样做。特别是,Java 语言规范要求在编译时计算常量表达式。

于 2010-10-09T23:04:04.120 回答
4

是的,它将根据 JLS 的要求进行简化(感谢@EJP 的精确度)。

如果您想要更多资源和 javac 优化,您应该查看Compiler optimizationsJava Compilers

另一个有趣的事情是,即使您的代码在编译期间进行了优化,也会在运行时使用热点进行第二次优化。


资源 :

在同一主题上:

于 2010-10-09T23:07:12.037 回答