次のコードが示すように、メモリを節約するために、レコードのような構造体をいくつか定義し、それらのインスタンスを配列に格納しました。
struct Foo
{
readonly char _bar;
readonly int _baz;
// other probable fields ...
public char Bar{get{return _bar;}}
public int Baz{get{return _baz;}}
public Foo(char bar, int baz){_bar = bar; _baz = baz;}
}
static void Main ()
{
Foo[] arr = new Foo[1000000];
int baz;
for(var i = 1000000; i-- > 0;){ arr[i] = new Foo('x',42); }
for(var i = 1000000; i-- > 0;)
{
baz = arr[i].Baz; //Will the Foo obj resides at arr[i] be copied?
}
}
上記のものがC/C ++で実装されている場合、コピーは発生しないことはわかっていますが、C#についてはよくわかりませんが、を?に置き換えるFoo[]
とどうなりList<Foo>
ますか?C#には参照を返すメカニズムがないため、理論的には、戻り値の最適化が含まれていない場合、インデクサーは参照型のポインター(4バイト)または値型のコピー全体を返します。では、この種のばかげたコピーが.NET / MONO jitによって回避されることが保証されているかどうか、誰か教えてもらえますか?