所以我对 C# 的理解是,在处理对象数组(而不是简单类型)时,数组将只是对对象的引用的连续数组,因此需要在每个元素上调用“new”来实际创建对象它。
Block[] blocks = new Block[10];
foreach(Block block in blocks)
{
block = new Block();
}
我想这会将'Block'
实例分布在整个内存中。
我希望我的实际对象连续存储在内存中,有什么方法可以在 C# 中执行此操作吗?
如果您将对象设为值类型(即structs
),它们将彼此相邻地存储在一个数组中,与存储基元实例( 、 等)的方式int
相同double
。例如,如果您声明
DateTime d[] = new DateTime[10];
您的DateTime
对象将连续存储在内存块中,因为DateTime
它是一个值类型。请注意,您也不需要调用构造函数:struct
数组中的所有 s 都将被初始化并准备好使用。
您可能担心 L1 缓存未命中,对吧?
你运气不好。一个接一个地分配多个对象很可能会导致这些对象在内存中是连续的。不幸的是,当 GC 完成它的工作时,您最终可能会发现对象到处都是。
编辑:一个建议
如果您确实必须将它们全部放在一个区域中,则可以将它们设为值类型并创建一个数组,或者使用不安全的代码并将fix
它们放在内存中。