.NET阵列的最大大小

Bri*_*ler 3 .net arrays

并非我需要这样做,但我想了解它是如何工作/不工作的.我用谷歌搜索了一个阵列的最大长度,并且找不到任何东西.

long[] hugeArray = new long[long.MaxValue];

//No exceptions
Console.WriteLine("Init");

//Overflow exception
Console.WriteLine(hugeArray.LongLength.ToString());

hugeArray = new long[int.MaxValue];

//OutOfMemoryException
Console.WriteLine( hugeArray.Length.ToString());
Run Code Online (Sandbox Code Playgroud)

我想一个后续问题就是,如果有一个限制并且我在该限制之外进行初始化,为什么在使用时只创建时没有例外?这是编译器应该捕获的东西吗?

Tim*_*son 5

数组的基础IL操作码处理IntPtr(在IL文档中称为native int):

  • newarr 创建一个数组,并接受一个 IntPtr
  • ldelemstelem读写元素,他们使用IntPtr索引
  • ldlen 返回数组的长度,并返回unsigned IntPtr

我希望32位平台上2 ^ 31-1的元素数量有理论上的限制,而64位平台上的元素数量为2 ^ 63-1.

但是,我刚刚在我的64位PC上尝试了这个代码,并且OutOfMemoryException在第一次分配时得到了一个,所以很明显实际限制更小.