为了节省内存,我定义了一些类似记录的结构并将它们的实例存储在数组中,如以下代码所示:
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 是否可以保证避免这种荒谬的复制?