7

コンパイラは 1 による乗算を最適化しますか? つまり、次のことを考慮してください。

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

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

const int a = 1;
4

4 に答える 4

14

文字列の連結を含め、コンパイル時に定数式を事前に計算します。がない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
于 2008-10-02T04:07:41.113 に答える
1

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

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

于 2008-10-02T04:35:30.720 に答える
1

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

于 2008-10-02T04:09:08.677 に答える
0

ここでコンパイラが最適化するのは、1 による乗算自体ではなく、コンパイル時に既知の値を使用した算術演算です。ええ、コンパイラは、. の有無にかかわらず、例のすべての数学を最適化しますconst

編集:有能なコンパイラ、私は言うべきです。

于 2008-10-02T04:17:48.687 に答える