Nic*_*ell 17 c# memory 64-bit memory-management reference
我正在运行c#中的2gb对象限制(由于某些令人讨厌的原因,这甚至适用于64位),其中包含大量结构(总共大小为4.2 gig).
现在显然使用List会给我一个大小为4.2gb给定或接受的列表,但是会使用由较小列表组成的列表,而这些列表又包含一部分结构,允许我跳过这个限制吗?
我的理由是,它只是CLR中的硬编码限制,阻止我在64位平台上实例化一个9gig对象,而且它与系统资源完全无关.Lists和Arrays也是引用类型,因此包含列表的List实际上只包含对每个列表的引用.因此,没有任何一个物体超过尺寸限制.
有什么理由不行吗?我现在自己尝试一下,但我手边没有内存分析器来验证.
Ree*_*sey 13
现在显然使用List会给我一个大小为4.2gb给定或接受的列表,但是会使用由较小列表组成的列表,而这些列表又包含一部分结构,允许我跳过这个限制吗?
是的 - 但是,如果您正在尝试解决此限制,我会考虑自己使用数组,而不是让List<T>
类管理数组.
CLR中的2gb单个对象限制正好是单个对象实例.当你创建一个struct(在List<T>
内部使用)的数组时,整个数组是CLR中的"一个对象实例".但是,通过使用List<List<T>>
或锯齿状数组,每个内部列表/数组都是一个单独的对象,它允许您有效地拥有所需的任何大小的对象.
CLR团队实际上在博客上发表了这篇文章,并提供了一个类似单一的示例BigArray<T>
实现List<T>
,但内部为您执行"阻止"管理.这是获得> 2gb列表的另一种选择.
请注意,.NET 4.5可以选择在x64上提供大于2gb的对象,但是您必须明确选择使用它.