并非我需要这样做,但我想了解它是如何工作/不工作的.我用谷歌搜索了一个阵列的最大长度,并且找不到任何东西.
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)
我想一个后续问题就是,如果有一个限制并且我在该限制之外进行初始化,为什么在使用时只创建时没有例外?这是编译器应该捕获的东西吗?
数组的基础IL操作码处理IntPtr(在IL文档中称为native int):
newarr 创建一个数组,并接受一个 IntPtrldelem和stelem读写元素,他们使用IntPtr索引ldlen 返回数组的长度,并返回unsigned IntPtr我希望32位平台上2 ^ 31-1的元素数量有理论上的限制,而64位平台上的元素数量为2 ^ 63-1.
但是,我刚刚在我的64位PC上尝试了这个代码,并且OutOfMemoryException在第一次分配时得到了一个,所以很明显实际限制更小.
| 归档时间: |
|
| 查看次数: |
7117 次 |
| 最近记录: |