我听某人说.NET中的最大数组大小是4GB?只是想知道这是不是真的。你不会梦想在32位.NET上这样做,但是在一个有12 GB RAM的64位系统上,也许,只是也许你可能想这样做。:-)
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个元素)。此选项的新规则包括:
IList<T>
UInt32.MaxValue
6uxekuva2#
在4.5之前的.NET版本中,最大对象大小为2GB。从4.5开始,如果启用gcAllowVeryLargeObjects,则可以分配更大的对象。请注意,string的限制不受影响,但“arrays”也应涵盖“lists”,因为lists是由数组支持的。
string
8ftvxx2r3#
.NET中任何一个对象的最大大小为2GB。当然,这对可以创建的原始数组的大小设置了严格的限制。如果您为一个“数组的数组”定义了自己的类,那么您就可以使它(甚至可以创建自己的索引器来访问它们,就好像它是一个连续的数组一样)尽可能地大。
3条答案
按热度按时间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个元素)。此选项的新规则包括:
6uxekuva2#
在4.5之前的.NET版本中,最大对象大小为2GB。从4.5开始,如果启用gcAllowVeryLargeObjects,则可以分配更大的对象。请注意,
string
的限制不受影响,但“arrays”也应涵盖“lists”,因为lists是由数组支持的。8ftvxx2r3#
.NET中任何一个对象的最大大小为2GB。
当然,这对可以创建的原始数组的大小设置了严格的限制。
如果您为一个“数组的数组”定义了自己的类,那么您就可以使它(甚至可以创建自己的索引器来访问它们,就好像它是一个连续的数组一样)尽可能地大。