Ах, причина, по которой я не понял, о чем вы говорите, в том, что вы смотрите на 64-битные источники, а не на 32-битные источники, как я изначально.
ЭтоОказывается, исходный файл исходного кода содержит директиву #if
.Он делает разные вещи в зависимости от того, определен ли символ AMD64
во время компиляции.
Комментарии в исходном коде весьма поучительны.По сути, при компиляции инфраструктуры для 64-битных платформ они решили развернуть цикл на 12 и проверить 3 четырех слов за раз.Это оптимизация производительности, которая стала возможной благодаря другой системной архитектуре.
// unroll the loop
#if AMD64
// for AMD64 bit platform we unroll by 12 and
// check 3 qword at a time. This is less code
// than the 32 bit case and is shorter pathlength
while (length >= 12)
{
if (*(long*)a != *(long*)b) break;
if (*(long*)(a+4) != *(long*)(b+4)) break;
if (*(long*)(a+8) != *(long*)(b+8)) break;
a += 12; b += 12; length -= 12;
}
#else
while (length >= 10)
{
if (*(int*)a != *(int*)b) break;
if (*(int*)(a+2) != *(int*)(b+2)) break;
if (*(int*)(a+4) != *(int*)(b+4)) break;
if (*(int*)(a+6) != *(int*)(b+6)) break;
if (*(int*)(a+8) != *(int*)(b+8)) break;
a += 10; b += 10; length -= 10;
}
#endif
Если вас интересуют внутренние компоненты .NET Framework, обязательно загрузите полную версию общего источника из этот сайт .Вы пропускаете много интересных вещей, когда пытаетесь сделать это, используя только .NET Reflector.Не последним из них являются комментарии.И, думаю, я видел, как люди спорят здесь, что комментарии не нужны в хорошо написанном коде!