=割り当て|をなぜJavaが最適化しませんか?

トビアス・ウルト:

t*()いつものように、この例のためにtrueを返すf*()常にfalseを返します。

我々は、次の式があるとしましょう

if ( f1() || t1() || f2() || t2() ){
    // do stuff        
}

この場合はJVMが実行してのみ実行を最適化f1()し、t1()それは理解して"ために関係なく、どのようなことをf2()してt2()歩留まり、if文を入力するための要件が満たされ、それ以上の計算は必要ありませんそのため。

私はこのような何かを書いたコードに取り組んでいます:

boolean b = false;
b |= f1(); // A
b |= t1(); // B
b |= f2(); // C
b |= t2(); // D

私の同僚の一人は、これを見て、彼はわからないですが、ので、Javaは、文CとDを最適化することを可能かもしれないと述べてb常にあるtrueの文からB以降、これはいくつかの問題につながる可能性があります。

私はいくつかのテストを実施し、それらのすべてが適切に実行されているかのように(これは望ましい動作である)ようだが、私はまだ思ったんだけど、この取得が最適化されていませんなぜですか?私は彼が正しいかもしれない考え出しとJVMはかつてのことを理解しb、真の無さで|=、それに対する操作は、その値を変更します。

スティーブンC:

これは、最適化されない理由を私はまだ思ったんだけど?

それは、JLSの違反になりますので。

声明

b |= f1();

に相当します

b = (boolean)(b | f1());

上記では、JLSは必要としているがb | f1()、以下のように評価されています。

  1. の値を取得しますb
  2. 呼び出しf1()と結果の値をキャプチャ
  3. 適用|二つの値に演算子を。

JLSはありません、コンパイラが呼び出しをスキップできるようにするf1()場合bであるtrue1

あなたがそのセマンティック(短絡)をしたい場合は、使用する必要があるb = b || f1();とそうで。(あなたが指摘したように:b ||= f1()構文エラーです。)


1 -実際には、状況にあること(シングルスレッドのプログラムで)観察することができませんでしたf1()コールが起こっていないか、あった、最適化は、理論的には許されるでしょう。しかし、あなただけ慎重に調べることによって最適化を検出することができるようになり、ネイティブコード JITコンパイラによって放出されたが。コールは、厳密に副作用無料だった場合、それはそれだけで発生する可能性があります。

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=222793&siteId=1