我正在查看.NET框架的Equals
类的String
方法实现,发现它使用EqualsHelper
方法。我发现它确实是一种非常酷且有效的方法,但是我发现了一些非常有用的东西,为什么它们通过除法运算来增加指针(或偏移量),例如:
*(long*)(ptr + (IntPtr)8 / 2), ptr += (IntPtr)4 / 2;
等等。
谢谢!
答案 0 :(得分:11)
啊,我没有看到你在说什么的原因是你正在查看64位源,而不是32位源,就像我原来那样。
事实证明,原始源代码文件中有一个#if
指令。根据在编译时是否定义AMD64
符号,它会执行不同的操作。
原始代码中的注释非常有启发性。基本上,在为64位平台编译框架时,他们选择将循环展开12并一次检查3 quadwords。这是通过不同的系统架构实现的性能优化。
// 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的内部感兴趣,请确保从this site下载完整版本的共享源代码。当您尝试仅使用.NET Reflector时,您会错过许多有趣的事情。其中最重要的是评论。而且想想,我看到人们在这里争辩说,在编写良好的代码中没有必要进行评论!