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