10

バイト配列から double のマネージ配列を作成しようとしています。現在動作に問題がありますが、最適化したかったのです。ここに私が働きたいいくつかのコードがあります:

private unsafe static double[] _Get_Doubles(byte[] _raw_data)
{
    double[] ret;
    fixed (byte* _pd = _raw_data)
    {
        double* _pret = (double*)_pd;
        ret = (double[])*_pret; //FAILURE
    }
}

これらの問題に対処する方法を教えてください。

-アーロン

4

2 に答える 2

3

投稿したコードについて注目すべき重要な点の 1 つは、戻り値が指しているアイテムの数を知る方法がなく、マネージ配列がその大きさを知る必要があることです。を返すdouble*か、 を作成しnew double[XXX]て値をコピーするか、(カウントが定数の場合) メンバーを使用して を作成しstructpublic fixed double _data[2];生データをその型にキャストすることもできます。

于 2009-12-16T19:39:44.427 に答える
3

今、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);
于 2010-12-01T14:26:58.180 に答える