我一直在研究一些与字节数组的最大大小有关的SO问题(herehere),并且一直在使用某些数组并获得一些我不太了解的结果。我的代码如下:

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

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


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

同样,byte[] myByteArr = new byte[Int32.MaxValue - 56];引发相同的异常。

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

最佳答案

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

不仅如此,而且在实践中,由于地址空间碎片,通常很难获得接近2GB的空间。 .NET的托管(即可移动)内存有所帮助,但不能消除此问题。

即使您使用的是64位进程,也可能会遇到类似的问题,因为在C#中,数组由int索引,该定义为32位带符号整数,因此无法处理超过2GB的边界以字节数组形式。如果您仔细阅读第二个链接的答案,还将看到每个对象2GB的限制。您的字节数组大概有一些开销,因此仅原始数据就无法达到完整的2GB。

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

关于c# - .net 32​​位最大字节数组大小是否小于2gb?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/30035934/

10-11 02:04