Enumerable.Range和内存分配
我有以下代码:
IEnumerable 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
检查我的申请,这个过程正在采取行动。 ~5.200KB。
元素正在成功迭代,因此必须在某处分配,对吧?
LINQ如何实现这一目标?
IEnumerable
不是数组。 它本身不存储任何信息。 实现它的类能够循环一组值。
这里的值不存储在数组中,而不是只是迭代并产生每次迭代的结果。
像这样的东西:
public IEnumerable GetRange(int start, int number) { for (int i = start; i < start + number; i++) { yield return i; } }
看,没有数组,没有存储空间。 它只记住迭代器中的当前位置,并可以执行适当的步骤来获取下一个。 此代码由C#编译器动态生成。