我正在尝试创建一个包含所有正整数的数组,我尝试了以下代码并且它总是抛出内存异常。
private int[] AllIntegers()
{
int[] all = new int[int.MaxValue];
for (int i = 0; i < int.MaxValue; i++)
{
all[i] = i;
}
return all;
}
我做错了什么?或者这根本不可能?!
答案 0 :(得分:0)
您正在尝试分配大约4 *(2 ^ 32 -1)字节的内存。这恰好是8GB,可能比您的系统提供的更多,或者更确切地说是您的流程可以分配的内容。
答案 1 :(得分:0)
如果您使用的是32位操作系统(在64位操作系统上可能会更改),则整数为4个字节(32位)。因此int.MaxValue是2 ^ 31(2 ^ 31 signed,2 ^ 31 unsigned),因此您尝试分配2 ^ 31个整数的数组。将此值乘以4个字节,即可获得8589934592个字节,即8 GB。
答案 2 :(得分:0)
正如其他人所说,你不能同时将所有信息保存在内存中。要获取所有自然数的列表,只需使用迭代器块,它一次只在内存中保存一个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;
}
}