byte[]的最大长度是多少?

26

我正在尝试创建一个长度为UInt32.MaxValuebyte数组。这个数组本质上是一个小型的内存数据库:

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

然而在我的电脑上,运行时我遇到了一个 "Arithmetic operation resulted in an overflow" 的 System.OverflowException 异常。

这是怎么回事呢?我需要使用 unsafe 块和 malloc 吗?在C#中我该怎么做?


10
我不知道有那么多的国家! - James
4个回答

38

当前的 System.Array 实现在其所有内部计数器等方面都使用 Int32,因此理论上最多可以有 Int32.MaxValue 个元素。

此外,Microsoft CLR 强制实施每个对象的最大 2GB 大小限制。

这里有一个很好的讨论和解决方法...

这里还有一些相关但不完全重复的问题和答案...


14
在.NET 4.5上,字节数组的最大可实例化长度为2147483591,比int.MaxValue小56。通过以下方式找到:
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)
    {}
}

3

字节数组的最大长度为:2130702268。

例如:

var countryCodes = new byte[2130702268];

-1
我一开始就不会这样做。为什么你想要为这个内存数据库设置那么多的内存?你不是更想要一个随着使用而增加大小的数据结构(例如 List<int>)吗?或者(如果喜欢的话)使用像 sqlite 这样的内存数据库?

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接