Будет ли у Java Compiler предотвращает суммы литералов?

StackOverflow https://stackoverflow.com/questions/3898259

Вопрос

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.

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


Ресурсы :

На ту же тему:

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top