.NET には、任意のメモリの連続した厳密に型指定された領域を表す相互に関連する型が多数含まれています。 これらの型は、 メモリのコピーやマネージド ヒープへの割り当てを必要以上に回避するアルゴリズムを 作成できるように設計されています。 ( Slice
、 AsSpan()
、コレクション式、またはコンストラクターを使用して) それらを作成する場合、基になるバッファーの複製は必要ありません。ラップされたメモリの "ビュー" を表す関連する参照とオフセットのみが更新されます。 高パフォーマンスコードでは、文字列を不必要に割り当てないようにするためにスパンがよく使用されます。
種類は次のとおりです。
System.Span<T>は、連続するメモリ領域へのアクセスに使用される型です。 Span<T> インスタンスは、
T
型の配列、stackalloc で割り当てられたバッファー、またはアンマネージ メモリへのポインターによってサポートできます。 スタックに割り当てる必要があるため、いくつかの制限があります。 たとえば、クラス内のフィールドを Span<T>型にしたり、非同期操作でスパンを使用したりすることはできません。System.ReadOnlySpan<T>は、 Span<T> 構造体の変更できないバージョンです。 インスタンスは、 Stringによってサポートすることもできます。
System.Memory<T>は、連続するメモリ領域のラッパーです。 Memory<T> インスタンスは、
T
型の配列またはメモリ マネージャーによってサポートできます。 マネージド ヒープに格納できるため、 Memory<T> には Span<T>の制限はありません。System.ReadOnlyMemory<T>は、 Memory<T> 構造体の変更できないバージョンです。 インスタンスは、 Stringによってバックアップすることもできます。
System.Buffers.MemoryPool<T>: 厳密に型指定されたメモリ ブロックをメモリ プールから所有者に割り当てます。 IMemoryOwner<T> インスタンスをプールからレンタルするには、 MemoryPool<T>.Rent を呼び出し、 MemoryPool<T>.Dispose()を呼び出してプールに解放します。
System.Buffers.IMemoryOwner<T>は、メモリ ブロックの所有者を表し、その有効期間管理を制御します。
MemoryManager<T>は、 Memory<T> の実装を置き換えるために使用できる抽象基本クラスです。これにより、 Memory<T> をセーフ ハンドルなどの追加の型でサポートできます。 MemoryManager<T> は、高度なシナリオを対象としています。
ArraySegment<T>: 特定のインデックスから始まる特定の数の配列要素のラッパー。
System.MemoryExtensionsは、文字列、配列、および配列セグメントを Memory<T> ブロックに変換するための拡張メソッドのコレクションです。
詳細については、 System.Buffers 名前空間を参照してください。
メモリとスパンの操作
通常、メモリ関連の型とスパン関連の型は処理パイプラインにデータを格納するために使用されるため、 Span<T>、 Memory<T>、および関連する型を使用する場合は、一連のベスト プラクティスに従う必要があります。 これらのベスト プラクティスについては 、Memory<T> と Span<T> の使用ガイドラインに記載されています。
こちらも参照ください
.NET