C# 为什么我在尝试创建大小为int.MaxValue的int数组时出现OutOfMemoryException

C# 为什么我在尝试创建大小为int.MaxValue的int数组时出现OutOfMemoryException,c#,arrays,int,C#,Arrays,Int,我正在尝试创建一个数组,其中包含所有可能的正整数,我尝试了下面的代码,它总是抛出内存不足异常 private int[] AllIntegers() { int[] all = new int[int.MaxValue]; for (int i = 0; i < int.MaxValue; i++) { all[i] = i; } return all; } private int[]AllIntegers() { int[]a

我正在尝试创建一个数组,其中包含所有可能的正整数,我尝试了下面的代码,它总是抛出内存不足异常

private int[] AllIntegers()
{
    int[] all = new int[int.MaxValue];

    for (int i = 0; i < int.MaxValue; i++)
    {
        all[i] = i;
    }

    return all;
}
private int[]AllIntegers()
{
int[]all=新的int[int.MaxValue];
对于(int i=0;i

我做错了什么?或者这根本不可能

Int.MaxValue
=2147483647,
sizeof(Int)
=4,因此需要8 GB内存来分配此数组。此异常表示操作系统无法分配此内存量

==更新==

:

在64位Windows上运行64位托管应用程序时 在操作系统中,您可以创建不超过2 GB的对象 (GB)


另请参见:

您正试图分配大约4*(2^32-1)字节的内存。这正好是8GB,可能超出了您的系统所能提供的容量,或者更确切地说,超出了您的进程所能分配的容量。

如果您在32位操作系统上(在64位操作系统上,这可能会发生变化),则整数为4字节(32位)。因此int.MaxValue是2^31(2^31有符号,2^31无符号),因此您试图分配一个由2^31个整数组成的数组。将其乘以4个字节,即得到8589934592个字节,即8 GB。

对于.NET对象大小有一个严格的上限,它们不能大于2 GB。即使是在64位操作系统上。您的阵列远远超出该大小


在32位操作系统上,您永远不会接近该限制,可用的最大连续虚拟内存块约为650兆字节。只有在启动时,这种情况才会迅速恶化。这是地址空间碎片化的副作用,由地址空间中的代码和堆的混合引起。只要每次分配的大小足够小,您可以分配的内存总量接近2GB。由于OOM导致的随机程序失败是很难处理的。正如其他人所说,您不能同时将所有信息保存在内存中。要获得所有自然数的列表,只需使用迭代器块,它一次只在内存中保存一个int,加上方法状态信息:

static void Main (string[] args)
{
    foreach (int i in Program.NaturalNumbers ())
    {
        Console.WriteLine (i);
    }
}

public static IEnumerable<int> NaturalNumbers ()
{
    for (int i = 0; i <= int.MaxValue; i++)
    {
        yield return i;
    }
}
static void Main(字符串[]args)
{
foreach(Program.NaturalNumbers()中的int i)
{
Console.WriteLine(i);
}
}
公共静态IEnumerable自然数()
{

对于(int i=0;i为什么需要这么大的阵列?请记住,这样的阵列至少需要8GB的ram。您运行的是32位还是64位系统?我使用的是win 7 64位,我有6GB内存。该值仅为expriment!否。错误意味着操作系统无法为进程分配那么多内存。用户可能安装了8GB,但可能安装了8GB不是所有的可寻址。即使他有那么多内存,我相信没有一个.NET对象可以超过2GB。