這個問題在這里已經有了答案: MemoryPool<T> 和 ArrayPool<T> 的區別 1 個回答 3天前關閉。
我明白了 的概念ArrayPools
。但我不太明白為什么要使用MemoryPools
(C#)。AMemory<T>
代表一個連續的記憶體區域,就像一個(更復雜的)指標。我的想法是,直接指向地址時不需要匯集。Afaik 什么都不需要分配(除了開銷)?但是這個 Struct 的存在,說明是有原因的……那又是什么呢?(谷歌搜索/stackoverflowed 但沒有發現某事。啟發)
使其具有可塑性:在這種沒有陣列池的使用場景中,有什么缺點?
var arr = new double[100];
var mem = arr.AsMemory(0,100);
對比
var pool = MemoryPool<double>;
var owner = pool.Shared;
var arr = new double[100];
var mem = owner.Rent(100);
mem = arr.AsMemory(0,100);
uj5u.com熱心網友回復:
AMemory<T>
需要一些記憶體來指向,并且需要分配這個記憶體。
MemoryPool 是租用預分配記憶體的地方。這不是Memory<T>
您租用的實際設備,而是它指向的記憶體。請注意,MemoryPool 為您提供了一個IMemoryOwner<T>
,即代表底層記憶體實際所有權的物件,您需要Memory<T>
從該介面獲取您的。
大于 ~87kb 的物件(除非已更改限制)在大物件堆 (LOH) 上分配。這僅在 gen 2 集合中收集,比 gen 0 集合慢得多。LOH 也不會自動進行碎片整理,如果過度使用,可能會導致碎片問題。因此,建議在頻繁分配和釋放大緩沖區時使用記憶體池。
因此,在您的示例中,使用記憶體池沒有任何好處。但是,例如,當在網路服務器中處理數百個數兆位元組的影像時,它可能很有用。
另外,你的例子沒有意義,它應該看起來像
using var owner = MemoryPool<double>.Shared.Rent(100); // Use the singleton pool
Memmory<double> mem = owner.Memory;
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/506453.html
下一篇:如何解釋C中陣列的指標?