Будет ли у Java Compiler предотвращает суммы литералов?
-
29-09-2019 - |
Вопрос
int i = 10 + 20;
Правда ли, что компилятор обработает этот код, добавляя 10 + 20
, и байтовый код такой же, как и для этой строки кода?
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
!
Другие советы
Да. Этот оптимизация компилятора называется постоянная складка. Анкет Есть еще одна оптимизация компилятора Редкое условное постоянное распространение это делает что-то подобное.
В целом, нет никакой гарантии, что данный компилятор действительно складывает постоянные, но в настоящее время почти каждый компилятор для каждого языка делает это. В частности, Спецификация языка Java требует, чтобы постоянные выражения были оценены во время компиляции.
Да, это будет упрощено Как требуется JLS (Благодаря @ejp для этой точности).
Если вы хотите больше ресурсов и оптимизации JavaC, вы должны взглянуть на Оптимизация компилятора или Java Compilers.
Еще одна интересная вещь, даже если ваш код оптимизирован во время компиляции, вторая оптимизация будет сделана во время выполнения с горячая точка.
Ресурсы :
На ту же тему: