Cod*_*ray 11
啊,我没有看到你在说什么的原因是你正在查看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
Run Code Online (Sandbox Code Playgroud)
如果您对.NET Framework的内部感兴趣,请确保从此站点下载完整版本的共享源.当您尝试仅使用.NET Reflector时,您会错过许多有趣的事情.其中最重要的是评论.并且想想,我看到人们在这里争论说,在编写良好的代码中没有必要进行评论!