3

私の安全でないメソッドは、コレクションbyte[]s を受け入れます。これらbyte[]の はすべて同じサイズです。

特定のパターンを探して、それらすべてを反復処理する必要があります。検索は本質的に再解釈キャスト スタイルです。各オフセットで、値を float、double、short、int などであるかのように考慮する必要がありますbyte*byte[]自然なアプローチのように。

byte*残念ながら、コレクションを作成する方法、またはより具体的には、配列のコレクションから初期化する方法が見つかりません。何か案は?

これは、タスクのやや不自然なバージョンです。

static unsafe void SearchIteration(List<byte[]> arrays, byte[] resultArr)
{
    fixed (byte* resultFix = resultArr)
    {
        byte* resultPtr = resultFix;
        byte*[] pointers = new byte*[arrays.Count];

        <some code to fix all the arrays and store the pointers in "pointers">

        int remaining = resultArr.Length;
        while (remaining > 0)
        {
            <look at resultPtr and each of the pointers and update *resultPtr>

            remaining--;
            for (int i = 0; i < pointers.Length; i++)
                pointers[i]++;
        }
    }
}

基本的に問題は、GC が配列を移動しないように配列を固定しながらpointers、 のアドレスで初期化する方法です。arrays

4

1 に答える 1

2

GCHandle.Alloc()から使用System.Runtime.InteropServices:

var handles = new GCHandle[arrays.Count];
byte*[] pointers = new byte*[arrays.Count];
for(int i = 0; i < arrays.Count; ++i)
{
    handles[i] = GCHandle.Alloc(arrays[i], GCHandleType.Pinned);
    pointers[i] = (byte*)handles[i].AddrOfPinnedObject();
}
try
{
    /* process pointers */
}
finally
{
    for(int i = 0; i < arrays.Count; ++i)
    {
        handles[i].Free();
    }
}
于 2010-08-24T20:34:30.130 に答える