1

refと の間でどちらが軽いか誰か教えてくださいout。キーワードと使用法refの正確な違いも知っています。out

私の場合、 と の両方を使用できますrefout、軽い方を疑問に思っています。

誰かが参照する必要がある場合は、ここにアクセスして、軽いものを教えてください。

前もって感謝します..

4

4 に答える 4

12

唯一の違いは、コンパイラのヒントです。

... アウト ...

public static void TestOut(out int test)
{
    test = 1;
}

.method public hidebysig static void  TestOut([out] int32& test) cil managed
{
  // Code size       4 (0x4)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.1
  IL_0002:  stind.i4
  IL_0003:  ret
} // end of method Program::TestOut

...参照..。

public static void TestRef(ref int test)
{
    test = 1;
}

.method public hidebysig static void  TestRef(int32& test) cil managed
{
  // Code size       4 (0x4)
  .maxstack  8
  IL_0000:  ldarg.0
  IL_0001:  ldc.i4.1
  IL_0002:  stind.i4
  IL_0003:  ret
} // end of method Program::TestRef

...outそしてref 事実上同じです。唯一の本当の違いは、outが、メソッドが返される前に値が設定されることを期待するようにコンパイラーに指示することです。フラグのある関数に値を送信することもできますがout、コンパイラーはそれを未割り当ての変数として扱います。ランタイムは実際には気にしません。どちらも変数へのポインタとして作成されます。関数に期待する機能を説明するキーワードを使用するのが最適です。これより下のJITerで「行われる可能性のある」最適化は、アプリケーションにほぼ0の影響を及ぼします。

于 2012-11-21T21:28:46.863 に答える
3

これはマイクロ最適化です。

実際、両方のオプションに対して生成されているILコードを見ると、違いはわかりません。Matthew Whitedが示したコンパイラのヒントを除いて:

.method private hidebysig static void  Out([out] valuetype [mscorlib]System.DateTime& d) cil managed

.method private hidebysig static void  Ref(valuetype [mscorlib]System.DateTime& d) cil managed

手元の状況に対して意味的に最も正しいオプションを提案するだけです。

于 2012-11-21T21:27:16.667 に答える
3

低レベルでは同じである可能性が高いです。パフォーマンスの違いがある場合、それはおそらく無視できるものであり、最適化するより良い場所があります。

于 2012-11-21T21:24:14.117 に答える
2

このリンク 、特に「結論 4:」のセクションを参照してください。

「out」と「ref」は、実際には舞台裏でまったく同じです。CLR は "ref" のみをサポートします。「out」は単なる「ref」であり、コンパイラは、問題の変数が確実に割り当てられていることがわかっている場合に関して、わずかに異なる規則を適用します。そのため、out/ref-ness のみが異なるメソッドのオーバーロードを作成することは違法です。CLR はそれらを区別できません。したがって、out のタイプ セーフの規則は、ref の場合と同じでなければなりません。

outの観点から実装されてrefおり、唯一の違いは何をコンパイルするかであり、実行時のパフォーマンスは同じです

于 2012-11-21T21:36:04.987 に答える