[解決済み] C# 7.2でのSpan<T>とMemory<T>の違いは何ですか?
質問
C# 7.2 では、2 つの新しい型が導入されました。
Span<T>
と
Memory<T>
のような以前のC#の型よりもパフォーマンスが向上しています。
string[]
.
質問です。の違いは何ですか?
Span<T>
と
Memory<T>
? なぜどちらかを使わなければならないのでしょうか?
どのように解決するのですか?
Span<T>
はスタックオンリーの性質を持っていますが
Memory<T>
はヒープ上に存在することができます。
Span<T>
は、私たちがプラットフォームに追加した、任意のメモリの連続した領域を表すための新しい型です。 任意のメモリの連続した領域を表現するために、プラットフォームに追加する新しい型です。 T[] と同等のパフォーマンス特性を備えています。その API は配列に似ています。 しかし、配列とは異なり、マネージドメモリ、ネイティブメモリ、またはスタック上に割り当てられたメモリを指すことができます。 スタック上に確保されたメモリを指すことができます。
Memory <T>
は型を補完するSpan<T>
. そのデザインドキュメントで説明されているように のドキュメントで説明されています。Span<T>
はスタックオンリーの型です。スタックオンリーであるためSpan<T>
への参照を保存する必要がある多くのシナリオには適しません。 バッファへの参照を保存する必要がある多くのシナリオには適しません。Span<T>
で表される) バッファへの参照をヒープ上に保存する必要がある多くのシナリオには適していません。 例えば、非同期呼び出しを行うルーチンなどです。
async Task DoSomethingAsync(Span<byte> buffer) {
buffer[0] = 0;
await Something(); // Oops! The stack unwinds here, but the buffer below
// cannot survive the continuation.
buffer[0] = 1;
}
<ブロッククオート
この問題に対処するために、私たちは一連の補完的な型を提供します。
表す汎用交換型として使用されることを意図しています。
ちょうど
Span <T>
のように、任意のメモリの範囲を表します。
Span <T>
とは異なり,スタックオンリーにはなりません.
その代償として、メモリへの読み書きに大きなパフォーマンス上のペナルティが発生します。
async Task DoSomethingAsync(Memory<byte> buffer) {
buffer.Span[0] = 0;
await Something(); // The stack unwinds here, but it's OK as Memory<T> is
// just like any other type.
buffer.Span[0] = 1;
}
<ブロッククオート
上記のサンプルでは
Memory <byte>
はバッファを表すのに使われています。
これは通常の型であり、非同期呼び出しを行うメソッドで使用することができます。
を呼び出すメソッドで使用できます。Spanプロパティは
Span<byte>
を返しますが、返された値
非同期呼び出しの間、返された値はヒープに保存されず、むしろ
から新しい値が生成される。
Memory<T>
の値から生成される。ある意味で
Memory<T>
のファクトリーであり
Span<T>
.
参考資料です。 こちら
関連
-
[解決済み】GDI+、JPEG画像をMemoryStreamに変換する際にジェネリックエラーが発生しました。
-
[解決済み] C#のStringとstringの違いは何ですか?
-
[解決済み] IDisposable インターフェースの正しい使用法
-
[解決済み] Try-catchは私のコードをスピードアップさせるか?
-
[解決済み] なぜList<T>を継承しないのですか?
-
[解決済み] C#のconstとreadonlyの違いは何ですか?
-
[解決済み] フィールドとプロパティの違いは何ですか?
-
[解決済み] IEnumerable<T> と IQueryable<T> を比較する。
-
[解決済み] キーワード「ref」と「out」の違いは何ですか?
-
[解決済み] C#では、public、private、protected、アクセス修飾子がないことの違いは何ですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】エラー。「戻り値を変更できません」 C#
-
[解決済み】"出力タイプがクラスライブラリのプロジェクトは直接起動できない"
-
[解決済み】Ajax処理で「無効なJSONプリミティブ」と表示される件
-
[解決済み】"The ConnectionString property has not been initialized "を修正する方法
-
[解決済み】プロジェクトビルド時のエラー。エディタでスクリプトにコンパイルエラーがあるため、Playerのビルドにエラーが発生する
-
[解決済み】OnCollisionEnter2Dが実行されない?
-
[解決済み] ...基礎となる接続は閉じられました。予期しないエラーが受信で発生しました
-
[解決済み】エラー「必要なフォーマルパラメータに対応する引数が与えられていない」を解決する?
-
[解決済み】Unityでゲームオブジェクトのすべての子をループスルーして破壊する方法?
-
[解決済み】「namespace」なのに「type」のように使われる。