Будет ли Java-компилятор пересчитывать суммы литералов?

int i = 10 + 20;

Правда ли, что компилятор обработает этот код, добавив 10 + 20и байт-код такой же, как для этой строки кода?

int i = 30;

Где я могу прочитать об этом?

3 ответа

Решение

Да, и вы даже можете проверить это сами. Возьмите небольшой файл 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!

Да. Эта оптимизация компилятора называется постоянным сворачиванием. Есть еще одна оптимизация компилятора, называемая редким условным распространением констант, которая делает нечто подобное.

В общем, нет никакой гарантии, что данный компилятор фактически свернет константы, но в настоящее время почти каждый компилятор для каждого языка делает это. В частности, спецификация языка Java требует, чтобы константные выражения оценивались во время компиляции.

Да, это будет упрощено в соответствии с требованиями JLS (спасибо @EJP за эту точность).

Если вам нужно больше ресурсов и оптимизация javac, вы должны взглянуть на оптимизацию компилятора или компиляторы Java.

Еще одна интересная вещь: даже если ваш код оптимизирован во время компиляции, вторая оптимизация будет выполняться во время выполнения с помощью горячей точки.


Ресурсы:

На ту же тему:

Другие вопросы по тегам