0

JIT 最適化について質問があります。簡単なコードをコンパイルしました:

class btest
{
        static final boolean flag=false;

        public final void foo(int x)
        {
                if(flag) {a=x; b=x*2; c=x*3;}
        }

        public void bar(int y)  {foo(y);}

        int a,b,c;
};

flagに設定されてfalseいるためfoo()、空のコードに完全にコンパイルされます-単に戻ります。しかし、bar()まだそれを呼び出します。

JITがこの呼び出しを排除する可能性はありますか? flag外部クラスに属しているかどうかは重要ですか?

よろしく

4

2 に答える 2

1

JIT コンパイラーは、これを排除できる可能性が最も高いでしょう。

ifしかし実際には、ステートメントはそれまでに最適化されて削除される可能性が高い思います。その理由は、JLS 14.21の次の箇所から始まります。

「ただし、if ステートメントを「条件付きコンパイル」の目的で便利に使用できるようにするために、実際のルールは異なります。」

コンパイラ(つまり、バイトコードコンパイラです!)は、コンパイル時の条件の既知の値に応じて、例で異なるコードを生成する可能性があると言い続けます。

この特別な処理はifステートメントにのみ適用され、条件が定数式の場合にのみ適用されることに注意してください。(この用語には非常に具体的な意味があります - JLS 15.28を参照してください) たとえば、ループで同じ「トリック」を試みると、while到達できないコードについて不平を言うコンパイル エラーが発生します。

(この「条件付きコンパイル」の特別な処理は、Java の初期の時代にさかのぼり、ゴスリングらがJava 言語にプリプロセッサを含めないという決定の論理的根拠の一部です。)

于 2013-07-19T14:58:46.930 に答える