2010-10-09 2 views

ответ

11

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

Да. Эта оптимизация компилятора называется constant folding. Есть еще одна оптимизация компилятора под названием sparse conditional constant propagation, которая делает что-то подобное.

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

4

Да, это будет упрощено as required by the JLS (спасибо @EJP за эту точность).

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

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


Ресурсы:

На эту же тему:

+1

Вы можете положиться на компилятор Java, вычисляющий константные выражения. Это требуется спецификацией, так что, например, метки меток, которые являются CE, могут быть законными. – EJP

+0

@ EJP, я не уверен на 100%, поэтому я изменю свой ответ, но можете ли вы предоставить ссылку на спецификацию для этой конкретной оптимизации? –

+3

Тот факт, что CE разрешены в случае выражений, делает его обязательным. См. 15.28 Константные выражения. – EJP