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

mec1mxoz  于 2023-03-13  发布在  .NET
关注(0)|答案(3)|浏览(191)

我听某人说.NET中的最大数组大小是4GB?只是想知道这是不是真的。你不会梦想在32位.NET上这样做,但是在一个有12 GB RAM的64位系统上,也许,只是也许你可能想这样做。:-)

wz3gfoph

wz3gfoph1#

一个数组理论上最多可以有2,147,483,647个元素,因为它使用int作为索引。实际的限制比这个稍低,这取决于数组中包含的类型。
然而,在.NET CLR中,即使是64位,也有2GB的最大单个对象限制,这就是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(0x 7 FFFFFC 7),对于其他类型,最大索引为2,146,435,071(0X 7 FEFFFFF)。
  • 字符串和其他非数组对象的最大大小不变。
6uxekuva

6uxekuva2#

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

8ftvxx2r

8ftvxx2r3#

.NET中任何一个对象的最大大小为2GB。
当然,这对可以创建的原始数组的大小设置了严格的限制。
如果您为一个“数组的数组”定义了自己的类,那么您就可以使它(甚至可以创建自己的索引器来访问它们,就好像它是一个连续的数组一样)尽可能地大。

相关问题