C# 是.net 32位最大字节数组大小<;2gb?

C# 是.net 32位最大字节数组大小<;2gb?,c#,.net,arrays,size,C#,.net,Arrays,Size,我一直在研究一些与字节数组(和)的最大大小相关的SO问题,并且一直在玩一些数组,得到一些我不太理解的结果。我的代码如下: byte[] myByteArr; byte[] myByteArr2 = new byte[671084476]; for (int i = 1; i < 2; i++) { myByteArr = new byte[671084476]; } byte[]myByteArr; 字节[]myByteArr2=新字节[671084476]; 对于(int i

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

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

for (int i = 1; i < 2; i++)
{
    myByteArr = new byte[671084476];
}
byte[]myByteArr;
字节[]myByteArr2=新字节[671084476];
对于(int i=1;i<2;i++)
{
myByteArr=新字节[671084476];
}
这将编译并在执行时在初始化
myByteArr
时抛出一个
'System.OutOfMemoryException'
。如果我将for循环中的2更改为1或注释掉其中一个初始化(或者
myByteArr2
或者
myByteArr
),它将正常运行

另外,
byte[]myByteArr=newbyte[Int32.MaxValue-56]引发相同的异常


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

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

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

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


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

我不确定为什么要在那里放一个for循环,如果您有两个用“new byte[671084476];”初始化的变量您会遇到同样的异常。或者甚至:解决方案中的链接甚至提供了解决方法:)