C#内存中连续对象的数组?

时间:2012-07-22 11:16:15

标签: c# arrays

所以我对C#的理解是,当处理一个对象数组(而不是简单类型)时,数组将只是对象的连续引用数组,因此需要在每个元素上调用'new'来实际创建它的对象。

Block[] blocks = new Block[10];

foreach(Block block in blocks)
{
    block = new Block();
}

我想这会在整个记忆中传播'Block'个实例。

我希望我的实际对象能够连续存储在内存中有没有办法在C#中执行此操作?

2 个答案:

答案 0 :(得分:2)

如果你使你的对象值类型(即structs),它们将在一个数组中彼此相邻存储,就像基元实例一样({{1}存储,{,int等)。例如,如果您声明

double

DateTime d[] = new DateTime[10]; 对象将连续存储在内存块中,因为DateTime is a value type。请注意,您也不需要调用构造函数:数组中的所有DateTime都将被初始化并准备好使用。

答案 1 :(得分:1)

您可能担心L1缓存未命中,对吧?

你运气不好。一个接一个地分配几个对象很可能导致对象在内存中连续。不幸的是,当GC完成它的工作时,你最终可能会得到满满的对象。

编辑:建议

如果你真的必须在一个区域中拥有它们,你可以使它们成为值类型并创建一个数组,或者使用不安全的代码并在内存中使用fix