32 位 .NET 最大字节数组大小是否 < 2GB?

Rhe*_*xis 4 .net c# arrays size limit

我一直在研究一些与字节数组的最大大小相关的问题(此处此处),并一直在处理一些数组并得到一些我不太理解的结果。我的代码如下:

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

for (int i = 1; i < 2; i++)
{
    myByteArr = new byte[671084476];
}
Run Code Online (Sandbox Code Playgroud)

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

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

为什么编译 32 位时会出现这种情况?不是在2GB限制之内吗?

Jam*_*mes 5

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

不仅如此,在实践中,由于地址空间碎片,通常很难达到 2GB 左右。.NET 的托管(即可移动)内存有所帮助,但并不能消除这个问题。

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

有关详细信息,请参阅评论中@Habib 的链接。