Будет ли Java-компилятор пересчитывать суммы литералов? - PullRequest
3 голосов
/ 10 октября 2010
int i = 10 + 20;

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

int i = 30;

Где можно прочитатьэто?

Ответы [ 3 ]

11 голосов
/ 10 октября 2010

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

6 голосов
/ 10 октября 2010

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

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

4 голосов
/ 10 октября 2010

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

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

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


Ресурсы:

На ту же тему:

...