查看.NET框架中的EqualsHelper方法

时间:2011-05-08 12:54:02

标签: c# .net string pointers

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

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

谢谢!

1 个答案:

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