在64位Windows上.NET中的数组的最大长度是多少

时间:2010-02-26 00:47:25

标签: .net arrays max

我从某人那里听说.NET中最大的数组大小是4 GB?只是想知道这是否属实。您不会梦想在32位.NET上执行此操作,但是在具有12 GB RAM的64位系统上,也许您可​​能想要这样做。 : - )

3 个答案:

答案 0 :(得分:39)

理论上,一个数组最多可以包含2,147,483,647个元素,因为它使用int进行索引。实际限制略低于此值,具体取决于数组中包含的类型。

但是,.NET CLR中最大单个对象限制为2GB,即使是64位也是如此。这是done by design

您可以轻松地在内部创建一个IList<T>实现,保留多个数组,并允许您超过2GB单个对象限制,但框架本身没有。

然而,通常情况下,这不是一个真正的问题。大多数情况下,你会有指向大类的数组 - 所以数组只是持有引用。这意味着您的阵列可以有效地指向许多GB内存 - 但阵列本身不能超过2GB。


请注意,从.NET 4.5开始,有一个新选项可供64位应用程序选择加入:gcAllowVeryLargeObjects。使用这个新选项集,可以在多维数组中获得UInt32.MaxValue(4,294,967,295)个元素,尽管单维数组仍然限制为2,146,435,071个元素(单个字节数组的2,147,483,591或包含结构的数组)没什么特别的)。

使用此选项的新规则是:

  • 数组中的最大元素数是UInt32.MaxValue。
  • 对于字节数组和单字节结构数组,任何单个维度的最大索引为2,147,483,591(0x7FFFFFC7),其他类型为2,146,435,071(0X7FEFFFFF)。
  • 字符串和其他非数组对象的最大大小不变。

答案 1 :(得分:6)

在4.5之前的.NET版本中,最大对象大小为2GB。从4.5开始,如果启用gcAllowVeryLargeObjects,您可以分配更大的对象。请注意,string的限制不受影响,但“数组”也应该包含“列表”,因为列表由数组支持。

答案 2 :(得分:0)

.NET中任何一个对象的最大大小为2GB。

当然,这会对你制作原始数组的大小设置一个硬性限制。

你可以创建一个“数组数组”(甚至可以创建自己的索引器来访问它们,就像它是一个连续的数组一样),如果你为它定义自己的类,它就像你想要的一样大。