5

以下のコードは、フォーム .Net Framework に反映されています。

[SecurityCritical]
public static unsafe void WriteInt64(IntPtr ptr, int ofs, long val){
    try{
        byte* numPtr = (byte*) (((void*) ptr) + ofs);
        if ((((int) numPtr) & 7) == 0){
            *((long*) numPtr) = val;
        }
        else{
            byte* numPtr2 = (byte*) &val;
            numPtr[0] = numPtr2[0];
            numPtr[1] = numPtr2[1];
            numPtr[2] = numPtr2[2];
            numPtr[3] = numPtr2[3];
            numPtr[4] = numPtr2[4];
            numPtr[6] = numPtr2[6];
            numPtr[7] = numPtr2[7];
        }
    }
    catch (NullReferenceException){
        throw new AccessViolationException();
    }
}

私の意見で*((long*) numPtr) = valは、十分であり、非常に効率的です。

なぜそんなに複雑なのですか?

4

1 に答える 1

6

最適化されていますが、かなり単純に見えます。

外側の if に注意してください - Int64 を 1 回の操作で書き込めるかどうかをチェックします (これは、メソッドに渡したポインタがプロパティにアラインされている場合に発生します - メモリ内の Int64 の開始点を指しています - アドレスは の倍数である必要があります)。 8)。

1 回の操作で書き込めない場合、コードは一度に 1 バイトずつ書き込み、ループをスキップして時間を節約します (これを「ループ展開」と呼びます)。

于 2012-07-16T09:00:59.963 に答える