分配大型阵列;内存不足异常 VS 溢出异常
本文关键字:异常 VS 溢出 内存不足 大型 阵列 分配 | 更新日期: 2023-09-27 18:36:37
请考虑以下事项:
long size = int.MaxValue;
long[] huge = new long[size]; // throws OutOfMemoryException
long[] huge = new long[size + 1]; // throws OverflowException
我知道单个对象的大小有 2GB 的限制,这解释了第一个异常,但是为什么一旦元素数量超过 32 位,我就会得到不同的异常?
(如果这很重要,我使用的是 64 位计算机)。
编辑:我还可以定义和使用一个接受long
的索引器,没有问题:
internal sealed class MyClass
{
public object this[long x]
{
get
{
Console.WriteLine("{0}", x);
return null;
}
}
}
...
long size = int.MaxValue;
MyClass asdf = new MyClass();
object o = asdf[size * 50]; // outputs 107374182350
C# 数组按 System.Int32
编制索引。由于size + 1
超出了Int32.MaxValue
,因此会得到整数溢出。
如果您确实想使用long
作为索引,请使用需要很长时间的Array.CreateInstance
重载。
因此,从我收集到的信息来看,这里正在发生类似以下的事情:
- 索引器通常可以使用任何类型的参数。
- 内置的数组索引器可以接受任何整数类型...
-
但是内置数组索引器的基础实现需要一个
<= Int32.MaxValue
的值,并且对于超过Int32.MaxValue
的值,将引发溢出异常。
虽然后一点感觉像是某种奇怪的矛盾(接受大于 Int32
的类型,但如果您碰巧实际使用了这些额外的位中的任何一个,则会抛出异常),但这显然是以下事实的副作用:其中一些是半实现的,用于将来的数组实现,数组将被允许具有 Int32.MaxValue
个以上的元素。