同じ型を返す代わりにrefを使うためのパフォーマンスコスト?

こんにちは、これは本当に私を悩ましていて、私は誰かが私に答えてくれることを願っています。私は ref
(と out )について読んできました。 s。一般的に私は次のようなものを置き換えます:

int AddToInt(int original, int add){ return original+add; }

〜と

void AddToInt(ref int original, int add){ original+=add; }//1st parameter gets the result

私の目には

AddToInt(ref _value, _add);

これよりも読みやすく、コードが簡単です

_value = AddToInt(_value, _add);

私は値を返すのではなく、 ref
を使ってコード上で何をやっているのか正確に知っています。しかし、パフォーマンスは私が真剣に取っていることであり、参照を使用すると逆参照とクリーンアップはかなり遅くなります。

私が知りたいのは ref
を渡す場所が非常に少ないということです(なぜあなたはアイデアを得ます)、 ref
の例はより小さく、よりクリーンで正確です。

また、値の型を返すよりも ref
が実際に遅い理由を知りたいと思っています。返す前に関数の値を大きく編集しようとすると、メモリから消去される直前に、その変数のインスタンスとは対照的に、実際の変数を参照する方が早いでしょう。

ベストアンサー

パフォーマンスと同じ見地で「ref」が使用される主な時間は、ゲームの「オブジェクト」がクラスではなく構造体によって非常に一般的に表されるXNAシナリオなど、非常に非典型的なケースについて論じるときです。
XNAに不均衡な影響を与えます)。これは次の場合に便利です。

  • 大型の構造体をスタックに複数回コピーしないようにする
  • 構造体のコピーを変更することによるデータの損失を防ぎます(XNA構造体は一般的に通常の方法とは異なります)
  • 構造体を直接配列に渡すことを許可します。

他のすべてのケースでは、
“ref”は戻り値に簡単には表現されない追加の副作用とより一般的に関連付けられます(たとえば、Monitor.TryEnterを参照)。

XNA/structのようなシナリオがなく、面倒な副作用がない場合は、戻り値を使用してください。より一般的な(それ自体が価値がある)ことに加えて、少ないデータを渡すこと(そしてintはx64のrefより小さい)を含むことができ、逆参照が少なくて済む可能性があります。

最後に、リターンアプローチはより汎用性があります。あなたはソースを更新したくはありません。コントラスト:

// want to accumulate, no ref
x = Add(x, 5);

// want to accumulate, ref
Add(ref x, 5);

// no accumulate, no ref
y = Add(x, 5);

// no accumulate, ref
y = x;
Add(ref y, x);

私は最後が最も明確ではないと思う(他の
“ref”がそれの後ろにある)とrefの使用法は明示的でない言語(例えばVB)の言語であまり明確ではない

コメントする

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です