【问题标题】:What is the maximum length of an array in .NET on 64-bit Windows64 位 Windows 上 .NET 中数组的最大长度是多少
【发布时间】:2011-01-21 06:42:56
【问题描述】:

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

【问题讨论】:

标签: .net arrays max


【解决方案1】:

一个数组理论上最多可以有 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 个元素(对于单字节数组或不包含任何 ut 的结构的数组,为 2,147,483,591 个元素一个字节)。

这个选项的新规则是:

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

【讨论】:

  • 您不能使用 long (Int64) 索引数组吗?您当然可以使用 Array.GetVaue() 和 long 允许更多元素 - 仍然可能存在并且数组将
  • @Mrk Mnl:是的,您可以使用长索引,但是 CLR 实现不允许您使用大于 int 索引的数组。 Microsoft 的 .NET 实现中的数组始终限制为 2147483647 个元素。
  • @Mrk Mnl:很可能是因为它不符合 CLS。
  • 虽然在撰写本文时答案是正确的,但 .NET 4.5 取消了此限制 - 请参阅 Mark Gravell 的答案。
  • @IanGriffiths 这改变了数组的最大尺寸,但它仍然对项目数有最大限制。我编辑了更多细节并更新了 4.5。
【解决方案2】:

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

【讨论】:

  • 如何在 .net 5 控制台应用程序上做到这一点?
  • @Mohamed 很确定它在 .NET 6 中默认启用;也可能在 .NET 5 中
【解决方案3】:

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

当然,这对您可以制作多大的原始数组设置了严格的限制。

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

【讨论】:

  • 为什么微软认为适合将 LongLength 添加到 .NET 2.0 中的数组对象?
  • @Keith:我怀疑它的存在是为了面向未来,尽管它在当前的 CLR 实现(包括 CLR 4)中并不能以任何有意义的方式真正使用。
  • @Keith:“为什么微软要添加 LongLength?” - 我猜这是因为 2GB 对象大小限制是一个实现细节,而不是合同限制。也可能是他们在某个时候计划达到极限,但发现这些好处不值得他们遇到的问题(或类似的事情)。
  • 从 .NET 4.5 开始,LongLength 现在很有用 - 请参阅 Marc Gravell 的回答
  • 这个答案应该被删除,它不再有效
猜你喜欢
  • 1970-01-01
  • 2010-09-27
  • 2015-12-21
  • 2012-08-08
  • 2010-09-13
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
相关资源
最近更新 更多