【问题标题】:what is the exact maximum limit of elements in an array数组中元素的确切最大限制是多少
【发布时间】:2014-04-09 14:20:21
【问题描述】:

这是一个纯粹的理论问题,所以请不要在你的回答中警告我。

如果我没记错的话,因为 .NET 中的每个数组都由 Int32 索引,这意味着索引范围从 0Int32.MaxValue

假设不涉及内存/GC 约束,.NET 中的数组最多可以包含 2147483648(而不是 2147483647)元素。对吧?

【问题讨论】:

标签: c# arrays


【解决方案1】:

嗯,理论上确实如此。事实上,理论上可以支持更大的数组 - 请参阅这个 Array.CreateInstance 签名,它采用 long 值作为长度。您无法使用 C# 索引器对这样的数组进行索引,但您可以使用 GetValue(long)

但是,在实际方面,我不相信任何实现都支持如此庞大的数组。 CLR 对每个对象的限制略低于 2GB,因此即使是字节数组实际上也不能有 2147483648 个元素。一些实验表明,在我的盒子上,您可以创建的最大数组是new byte[2147483591]。 (那是在 64 位 .NET CLR 上;我已经安装了 Mono 的版本。)

编辑:仅查看 CLI 规范,它指定数组具有 Int32 的下限和上限。这意味着禁止Int32.MaxValue 的上限,即使它们可以用Array.CreateInstance 调用来表达。但是,它意味着允许有一个边界为Int32.MinValue...Int.MaxValue 的数组,即总共有 4294967296 个元素。

编辑:再看一遍,ECMA 335 分区 III 第 4.20 节 (newarr) 指定使用 newarr 初始化 vector 类型必须采用 native intint32 值.所以看起来虽然 CLI 术语中通常更宽松的“数组”类型必须具有 int32 边界,但“向量”类型却没有。

【讨论】:

  • 非常感谢乔恩!当然在实际情况下这是不可能的,但是当代码正确性是强制性的时,就必须处理这种事情。
  • @Miguel:“代码正确性”与您的问题有什么关系?
  • 我需要确保在任何情况下都不会超过这类事情的理论限制。
  • @Miguel:您当然需要确保永远不会超过 实际 限制......因为它们将真正决定代码是否可以运行。崩溃的“正确”代码并不是很有用,是吗?这里的上下文是什么? long.MaxValue 的限制是否对您有帮助,如果这是真正的理论约束而不是 int.MaxValue?您应该阅读 CLI 规范以了解更多详细信息。
  • 为什么在 64 位机器上 2GB 数组的数组开销是 56 字节?
猜你喜欢
  • 1970-01-01
  • 2018-01-23
  • 1970-01-01
  • 1970-01-01
  • 2011-04-23
  • 1970-01-01
  • 1970-01-01
  • 2011-08-31
  • 2017-01-28
相关资源
最近更新 更多