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

Kei*_*ill 23 .net arrays max

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

Ree*_*sey 40

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

但是,.NET CLR中最大单个对象限制为2GB,即使是64位也是如此.这是通过设计完成的.

您可以轻松地在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).
  • 字符串和其他非数组对象的最大大小不变.

  • @IanGriffiths 这改变了数组的最大 SIZE,但它仍然对项目数量有最大限制。我编辑了更多细节并更新为 4.5。 (2认同)

Mar*_*ell 6

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