查看.NET框架中的EqualsHelper方法

我正在查看.NET框架的String类的Equals方法实现,发现它使用EqualsHelper方法。 我发现它确实是一种非常酷且有效的方法,但是我发现了一些非常有用的东西,为什么它们通过除法运算来增加指针(或产生偏移),如:

*(long*)(ptr + (IntPtr)8 / 2), ptr += (IntPtr)4 / 2; 等等。

谢谢!

啊,我没有看到你在说什么的原因是你正在查看64位源,而不是32位源,就像我原来的那样。

事实certificate,原始源代码文件中包含#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时,您会错过许多有趣的事情。 其中最重要的是评论。 而且想想,我看到人们在这里争论说,在编写良好的代码中没有必要进行评论!