12

次のコードが与えられます:

const int constA = 10;
const int constB = 10;

function GetX(int input) {
    int x = constA * constB * input;
    ...
    return x;
}

.Netコンパイラは式を「置き換え」て1000を入れ、計算が何度も繰り返されないようにしますか?

コードはどのような状況で最も速く実行されますか?

  1. int x = constA * constB * input;
    
  2. int x = 10 * 10 * input;
    
  3. int x = 100 * input;
    

オプション3は2よりも高速になると思いますが、最も読みやすいオプションではない場合もあります。コンパイラはこのようなパターンを認識し、それに応じて最適化しますか?

4

2 に答える 2

19

C#定数式

式が上記のタイプのいずれかであり、上記の構成のみが含まれている場合は常に、式はコンパイル時に評価されます。これは、式が非定数構造を含むより大きな式の部分式である場合でも当てはまります。

(必要に応じて、さらに詳しく読む必要があります)参照される「上記」は、次のような箇条書きです。

  • クラスおよび構造体型のconstメンバーへの参照。

と、

  • 事前定義された+、–、*、/、%、<<、>>、&、|、^、&&、||、==、!=、<、>、<=、および>=二項演算子オペランドは上記のタイプです。

したがって、質問に直接答えるために、はい、コンパイラはコンパイル時に計算を実行します。

于 2013-02-07T13:47:26.177 に答える
9

私はLINQPadでこれを試しました:

const int constA = 2;
const int constB = 50;

void Main()
{

    Console.WriteLine(GetX(12));
}

int GetX(int input) 
{
    int x = constA * constB * input;

    return x;
}

ILは:

ここに画像の説明を入力してください

16進数の64の値(10進数で100)は、定数の乗算の結果です。mul演算は、による乗算inputです。

したがって、定数に適用される演算はコンパイラによって最適化されているように見えます。

于 2013-02-07T13:51:00.413 に答える