2010-10-15 141 views
17

我试图创建一个长度为UInt32.MaxValuebyte的数组。该阵列基本上是一个小的(ISH)的内存数据库:字节[]的最大长度?

byte[] countryCodes = new byte[UInt32.MaxValue]; 

在我的机器,但是,在运行时,我得到一个System.OverflowException“算术运算导致溢出”。

这是怎么回事?我是否需要使用unsafe区块和malloc?我将如何在C#中做到这一点?

+4

我不知道有这么多的国家! – James 2015-06-10 21:47:45

回答

24

System.Array的当前实现对其所有内部计数器等使用Int32,所以元素的理论最大数量为Int32.MaxValue

还有一个由Microsoft CLR施加的每个对象最大2GB的限制。

很好的讨论和解决办法在这里...

和一些相关,不-相当重复的,问题和答案在这里...

1

我不会这样做的第一个地方。为什么你想为这个内存数据库设置所有内存?难道你不想要一个数据结构的大小随着你的增长而增加(例如List<int>)?或者(如果喜欢)使用内存数据库,如sqlite

7

.NET 4.5一个字节数组的最大可实例化长度为:2147483591,或56小于int.MaxValue。发现通过:

for (int i = int.MaxValue; i > 0; i--) 
{ 
    try 
    { 
     byte[] b = new byte[i]; 
     Console.Out.WriteLine("MaxValue: " + i); 
     Environment.Exit(0); 
    } 
    catch (Exception ignored) 
    {} 
}