4
int i = 10 + 20;

コンパイラがこのコードを処理して を追加10 + 20し、バイト コードがこのコード行と同じであるというのは本当ですか?

int i = 30;

それについてどこで読むことができますか?

4

3 に答える 3

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!

于 2010-10-09T23:08:34.110 に答える
6

はい。このコンパイラの最適化は、定数の折りたたみと呼ばれます。同様のことを行うスパース条件付き定数伝播と呼ばれる別のコンパイラ最適化があります。

一般に、特定のコンパイラが実際に定数を折りたたむという保証はありませんが、最近では、すべての言語のほぼすべてのコンパイラがこれを行っています。特に、Java 言語仕様では、コンパイル時に定数式を評価する必要があります。

于 2010-10-09T23:04:04.120 に答える
4

はい、JLS の要求に応じて簡略化されます(この精度については @EJP に感謝します)。

より多くのリソースと javac の最適化が必要な場合は、Compiler OptimizationsまたはJava Compilersを参照してください。

もう 1 つの興味深い点は、コンパイル中にコードが最適化されたとしても、実行時にhotspotを使用して 2 回目の最適化が行われることです。


資力 :

同じトピックで:

于 2010-10-09T23:07:12.037 に答える