2011-11-15 7 views
2

場合:コンパイラの最適化Iは、コンパイラの、あまりにも多くの知識を持っていないとどのように.NETが生成されたマシンコードを最適化しますが、次のシナリオを理解したいと思います/他

class AnyClass 
    { 
     public bool anyFlag; 
     AnyClass() 
     { 
      anyFlag = true; 
     } 

     public void Action()   
     { 
      if(anyFlag) 
       //Perform Certain Actions 
     } 
    } 

anyFlagは全体で変更されません。プログラムの範囲。コンパイラはActionメソッドのMIL/machine codeを生成しますか?もしそうなら、そこにチェックインがありますか?

+0

私はあなたがprivate bool anyFlagを意味すると思います。 –

+0

なぜあなたはそれほど重要なのですか? – svick

+0

私は理解の観点から質問を多くしました。そして私は結局それが問題になると思います:) – Aziz

答えて

7

あなたのanyFlagがpublicなので(複数の場所から変更できるので)コンパイラはif文をフィルタリングしません。コンストラクタで値が設定されているだけなので、コンパイラは今もこの実行時までの値。

次のコードは何をしたいん:あなたはVisual Studioでこのコードを挿入した場合

static void MyFunc() 
{ 
    const bool flag = true; 

    string s = null; 
    if (flag) 
    { 
     s = "a"; 
    } 
    else 
    { 
     s = "b"; 
    } 
} 

は、あなたがそのS =「b」を述べて生成された警告が表示されます。このコードは最適化されません。

1

はい、コンパイラはILを生成します。あとでユーザーリフレクションやEmitを呼び出してそのメソッドを呼び出したり、anyFlagの値を変更したりすることができるので、それを保持します。これは、Visual Studioに付属のildasmを使用して、生成された実行可能ファイルを逆アセンブルすることで表示できます。

+3

しかし、パフォーマンスに関しては、ILは本当に重要ではありません。JITによって生成されたネイティブコードがあります。 – svick

+0

確かに、しかし、JITerの最適化はブラックボックスであり、この点についての仕様はないからです。あなたはそれが仕事をしていると信じなければなりません。もっと重要なことは、ILが生成され、開発者が必要に応じてコードにアクセスできることです。 – Polynomial

+0

@Polynomial '生成された実行可能ファイルをildasm'で逆アセンブルして表示することができます。上記のコード(' const bool')を自分で試してみてください。 –

関連する問題