Будет ли 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.
Еще одна интересная вещь: даже если ваш код оптимизирован во время компиляции, вторая оптимизация будет выполняться во время выполнения с помощью горячей точки.
Ресурсы:
На ту же тему: