簡體   English   中英

Enumerable.Range和內存分配

[英]Enumerable.Range and Memory allocation

我有以下代碼:

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.MaxValueint量應該占用~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#編譯器動態生成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM