コンパイラは 1 による乗算を最適化しますか? つまり、次のことを考慮してください。
int a = 1;
int b = 5 * a;
式 5 * a はちょうど 5 に最適化されますか? そうでない場合、 a が次のように定義されている場合はそうなるでしょうか。
const int a = 1;
コンパイラは 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
mono コンパイラによって生成されたコードを見ると、非 const a を持つバージョンは実行時に乗算を実行します。つまり、乗算は最適化されていません。const を作成すると、乗算が最適化されます。
Microsoft コンパイラには、より積極的なコンパイラが含まれている可能性があります。最善の解決策は、コンパイラによって生成されたコードを調べて、コンパイラが何をしているかを確認することです。
定数伝播は、最も一般的で簡単な最適化の 1 つです。
ここでコンパイラが最適化するのは、1 による乗算自体ではなく、コンパイル時に既知の値を使用した算術演算です。ええ、コンパイラは、. の有無にかかわらず、例のすべての数学を最適化しますconst
。
編集:有能なコンパイラ、私は言うべきです。