Javaコンパイラはリテラルの合計を事前に計算しますか?
-
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
}
明らかにbytecodeでは、コンパイラの最適化を確認できます。 bipush 30
!
他のヒント
はい。このコンパイラの最適化は呼び出されます 一定の折りたたみ. 。別のコンパイラ最適化と呼ばれます まばらな条件付き一定の伝播 それは似たようなことをします。
一般に、特定のコンパイラが実際に定数を折りたたむという保証はありませんが、最近ではすべての言語のほぼすべてのコンパイラがこれを行います。特に、 Java言語仕様 コンパイル時に定数式を評価する必要があります。
はい、簡素化されます JLSで要求されています (この精度について@EJPに感謝します)。
より多くのリソースとJavacの最適化が必要な場合は、 コンパイラの最適化 また Javaコンパイラ.
もう1つの興味深いことは、コンピレーション中にコードが最適化されたとしても、ランタイム中に2回目の最適化が行われることです。 ホットスポット.
資力 :
同じトピックについて:
所属していません StackOverflow