int i = 10 + 20;
Верно ли, что компилятор обработает этот код, добавив 10 + 20
, а байт-код будет таким же, как для этой строки кода?Будет ли компилятор Java вычислять суммы литералов?
int i = 30;
Где я могу прочитать об этом?
int i = 10 + 20;
Верно ли, что компилятор обработает этот код, добавив 10 + 20
, а байт-код будет таким же, как для этой строки кода?Будет ли компилятор Java вычислять суммы литералов?
int i = 30;
Где я могу прочитать об этом?
Да, и вы даже можете проверить это для себя. Возьмите небольшой файл 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
!
Да. Эта оптимизация компилятора называется constant folding. Есть еще одна оптимизация компилятора под названием sparse conditional constant propagation, которая делает что-то подобное.
В общем, нет гарантии, что данный компилятор будет фактически сбрасывать константы, но в настоящее время почти каждый компилятор для каждого языка делает это. В частности, Java Language Specification требует, чтобы константные выражения оценивались во время компиляции.
Да, это будет упрощено as required by the JLS (спасибо @EJP за эту точность).
Если вам нужны дополнительные ресурсы и оптимизация javac, вы должны взглянуть на Compiler optimizations или Java Compilers.
Еще одна интересная вещь: даже если ваш код оптимизирован во время компиляции, во время выполнения будет проведена вторая оптимизация с hotspot.
Ресурсы:
На эту же тему:
Вы можете положиться на компилятор Java, вычисляющий константные выражения. Это требуется спецификацией, так что, например, метки меток, которые являются CE, могут быть законными. – EJP
@ EJP, я не уверен на 100%, поэтому я изменю свой ответ, но можете ли вы предоставить ссылку на спецификацию для этой конкретной оптимизации? –
Тот факт, что CE разрешены в случае выражений, делает его обязательным. См. 15.28 Константные выражения. – EJP