.net 32​​ 位最大字节数组大小是否 < 2gb?

Is the .net 32-bit max byte array size < 2gb?

我一直在研究一些与字节数组的最大大小 (here and here) 相关的 SO 问题,并且一直在研究一些数组并得到一些我不太明白的结果。我的代码如下:

byte[] myByteArr;
byte[] myByteArr2 = new byte[671084476];

for (int i = 1; i < 2; i++)
{
    myByteArr = new byte[671084476];
}

这将编译并在执行时将在 myByteArr 的初始化时抛出 'System.OutOfMemoryException'。如果我将 for 循环中的 2 更改为 1,或者我注释掉其中一个初始化(myByteArr2myByteArr),它将 运行 正常。

此外,byte[] myByteArr = new byte[Int32.MaxValue - 56]; 抛出相同的异常。

为什么在为 32 位编译时会发生这种情况?它们不在 2gb 限制内吗?

32 位程序的限制不是针对每个对象的。这是一个 进程 限制。您使用的总容量不能超过 2GB。

不仅如此,在实践中,由于地址 space 碎片,通常很难获得接近 2GB 的空间。 .NET 的托管(即可移动)内存在一定程度上有所帮助,但并没有消除这个问题。

即使您使用的是 64 位进程,您也可能会遇到类似的问题,因为在 C# 中,数组由 int 索引,它被定义为 32 位有符号整数,因此可以' 地址超过 2GB 字节数组中的边界。如果仔细阅读第二个 link 的答案,您还会看到每个对象 有 2GB 限制。您的字节数组可能有一些开销,因此它不能仅用于原始数据就达到完整的 2GB。

查看评论中@Habib 的 link 了解详情。