我查看了 .NET 框架的 String
类的 Equals
方法实现,发现它使用了 EqualsHelper
方法。我发现这确实是一种非常酷且高效的方法,但我发现了一些非常奇怪的东西,为什么它们通过除法运算来增加指针(或进行偏移),例如:
*(long*)(ptr + (IntPtr)8/2), ptr += (IntPtr)4/2;
等等。
谢谢!
最佳答案
啊,我没有看到你在说什么的原因是你在看 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 时,您会错过很多有趣的事情。其中最重要的是评论。想想看,我看到人们在这里争论说在编写良好的代码中注释不是必需的!
关于c# - 深入了解 .NET 框架中的 EqualsHelper 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5927545/