gpt4 book ai didi

c# - Enumerable.Range 和内存分配

转载 作者:太空狗 更新时间:2023-10-30 00:14:06 25 4
gpt4 key购买 nike

我有以下代码:

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

检查我的应用程序,进程占用了大约。 ~ 5.200KB。

元素迭代成功,所以它们必须分配到某个地方,对吧?

LINQ 如何实现这一点?

最佳答案

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

这里的值没有存储在数组中,而只是迭代并产生每次迭代的结果。

像这样:

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

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

关于c# - Enumerable.Range 和内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33217435/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com