所以我对C#的理解是,当处理一个对象数组(而不是简单类型)时,数组将只是对象的连续引用数组,因此需要在每个元素上调用'new'来实际创建它的对象。
Block[] blocks = new Block[10];
foreach(Block block in blocks)
{
block = new Block();
}
我想这会在整个记忆中传播'Block'
个实例。
我希望我的实际对象能够连续存储在内存中有没有办法在C#中执行此操作?
答案 0 :(得分:2)
如果你使你的对象值类型(即structs
),它们将在一个数组中彼此相邻存储,就像基元实例一样({{1}存储,{,int
等)。例如,如果您声明
double
DateTime d[] = new DateTime[10];
对象将连续存储在内存块中,因为DateTime
is a value type。请注意,您也不需要调用构造函数:数组中的所有DateTime
都将被初始化并准备好使用。
答案 1 :(得分:1)
您可能担心L1缓存未命中,对吧?
你运气不好。一个接一个地分配几个对象很可能导致对象在内存中连续。不幸的是,当GC完成它的工作时,你最终可能会得到满满的对象。
编辑:建议
如果你真的必须在一个区域中拥有它们,你可以使它们成为值类型并创建一个数组,或者使用不安全的代码并在内存中使用fix
。