今、stackallocそれが正しい方法だと思ったのですが、失敗しました。最も重要なことは、失敗する運命にあったことを今知ったことです。やりたいことは仕方がない。
これは、質問を言い換えることで確認できます。
「安全でない」配列の周りにマネージド配列を作成するにはどうすればよいですか?
マネージ配列にはヘッダー情報があるため (メモリ チャックの周りのクラスであるため)、配列自体よりも多くのメモリ領域が必要です。したがって、答えは次のとおりです。
配列自体の前 (および/または後) に領域を割り当て、管理された情報 (長さなど) を「安全でない」配列の周りに置きます。
配列の周りに十分なデータがあることを保証することはせいぜい不安定であるため、これは簡単には不可能です。私の特定の例では、配列の周りにデータがあることを意味するマネージド byte[] が渡されるため、十分なスペースがあるかもしれませんが、同じデータがマネージド double[] に適切であると断言することはせいぜい疑わしいですが、ほとんど間違っている可能性が高く、データを変更して管理された double[] に適したものにすることは悪質です。
[編集]
Marshal.Copyここへ行く道のようです。新しい配列を作成し、元帥にそれらをコピーさせます (彼が私よりも速いことを期待して、またはおそらく後で、彼はより速くなるでしょう):
var ret = new double[_raw_data.Length / sizeof(double)];
System.Runtime.InteropServices.Marshal.Copy(new System.IntPtr(_pret), ret, 0, ret.Length);