Open7
C# の Span<T>とMemory<T> を勉強する
が面白かったので実際にサンプルを書いて手を動かしてみる。
コードの置き場所。
stackalloc したものを Span にして戻り値で返そうとするとちゃんとコンパイルエラーにしてくれる。
受け取ったものが配列ならもちろん OK。
C# の Span って配列の途中のポインタとその長さの int 値しか保持していないという理解なんだけどそれだけでどうやって配列の GC 保護してるの?
このページに詳しかった。マネージドポインタ扱いになるんだな。
- メソッド引数、ローカル変数、ボックス化された値型
- インスタンス・フィールド
- 静的フィールド
- 配列の要素(と最終要素の次の要素)
span や span を持つ ref 構造体は Task には渡せない。
ChatGPT と Google 検索しながら理解できた。Span 内の配列の途中ポインタはマネージドポインタ扱いになってちゃんと保護されるのだと理解。
おそらく stackalloc が渡されたときはマネージドポインタにならないはずだけと、どちらもSpan<int> なのにどうやって判定しているのだろう?