Enumerable.Range和Memory allocation

时间:2015-10-19 14:47:19

标签: c# .net linq ienumerable

我有以下代码:

IEnumerable<int> elements = Enumerable.Range(1, Int32.MaxValue);
Console.WriteLine("Size of System.Int32: {0}", sizeof(int));
Console.Write("Iterating over {0} elements... ", elements.Count());
Parallel.ForEach(elements, _ => { });
Console.WriteLine("Done.");

打印出来:

> Size of System.Int32: 4
> Iterating over 2147483647 elements... Done.

但是,我不明白为什么这不会抛出OutOfMemoryException

知道每个int值占用4个字节的空间,分配Int32.MaxValue量的int应该占用 ~8GB

检查我的申请,这个过程正在采用aprox。 ~5.200KB。

元素正在成功迭代,因此必须将它们分配到某个地方,对吧?

LINQ如何实现这一目标?

1 个答案:

答案 0 :(得分:11)

IEnumerable<int>不是数组。它本身不存储任何信息。实现它的类能够循环一组值。

此处的值不存储在数组中,而只是迭代并产生每次迭代的结果。

这样的事情:

public IEnumerable<int> GetRange(int start, int number)
{
    for (int i = start; i < start + number; i++)
    {
        yield return i;
    }
}

看,没有数组,没有存储空间。它只记住迭代器中的当前位置,并可以执行适当的步骤来获取下一个。此代码由C#编译器即时生成。