.net 32位最大字节数组大小是否<2gb?
我一直在寻找一些与字节数组的最大大小相关的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或者我注释掉其中一个初始化( myByteArr2
或myByteArr
)它将正常运行。
另外, byte[] myByteArr = new byte[Int32.MaxValue - 56];
抛出同样的exception。
为什么在编译为32位时会发生这种情况? 它们不在2gb范围内吗?
32位程序的限制不是每个对象。 这是一个过程限制。 您使用的总数不得超过2GB。
不仅如此,在实践中,由于地址空间碎片,通常很难达到2GB附近。 .NET的托管(即可移动)内存有所帮助,但并未消除此问题。
即使您使用的是64位进程,也可能会遇到类似的问题,因为在C#数组中由int
编制索引,这被定义为32位有符号整数,因此无法解决超过2GB边界的问题。字节数组。 如果您仔细阅读第二个链接的答案,您还会看到每个对象限制为2GB。 您的字节数组可能有一些开销,因此它不能仅仅为原始数据获得完整的2GB。
有关详细信息,请参阅注释中的@ Habib链接。