質問

コンパイラは乗算を1で最適化しますか?つまり、考慮してください:

int a = 1;
int b = 5 * a;

式5 * aは5に最適化されますか?そうでない場合、aが次のように定義されている場合、次のようになります。

const int a = 1;
役に立ちましたか?

解決

文字列の連結など、コンパイル時に定数式を事前計算します。 const がなければ、そのまま残されます。

最初の例はこのILにコンパイルされます:

.maxstack 2
.locals init ([0] int32, [1] int32)

ldc.i4.1   //load 1
stloc.0    //store in 1st local variable
ldc.i4.5   //load 5
ldloc.0    //load 1st variable
mul        // 1 * 5
stloc.1    // store in 2nd local variable 

2番目の例はこれにコンパイルされます:

.maxstack 1
.locals init ( [0] int32 )

ldc.i4.5 //load 5 
stloc.0  //store in local variable

他のヒント

定数伝播は、最も一般的で簡単な最適化の1つです。

monoコンパイラーによって生成されたコードを見ると、非const aのバージョンは実行時に乗算を実行します。つまり、乗算は最適化されません。 constを作成すると、乗算が最適化されます。

Microsoftコンパイラーには、より積極的なコンパイラーが搭載されている可能性があります。最適な解決策は、コンパイラーによって生成されたコードを調べて、コンパイラーの動作を確認することです。

ここでコンパイラが最適化するのは、1単位の乗算ではなく、コンパイル時に既知の値を使用した算術演算です。そのため、コンパイラーは、 const の有無にかかわらず、サンプルのすべての数学を最適化します。

編集: 有能なコンパイラ、私は言う必要があります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top