c# - 深入了解 .NET 框架中的 EqualsHelper 方法

标签 c# .net string pointers

我查看了 .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/

相关文章:

c# - 是否还有必要再使用 ArrayList 类?

.net - .NET 的 MS Access 数据库是否可移植?

c# - 检测字符串是否全部大写

.net - 在 SQL Server 中存储特殊 unicode 字符并在 .NET 中检索

java - 既然我们已经有了 StringBuilder,为什么还要使用 StringJoiner?

javascript - 返回字符串而不是 null

c# - 如何将 Azure AD 身份验证应用程序从开发计算机移动到服务器?

c# - 如何返回松散类型的对象?

c# - 打包 uri 验证

c# - 如何在任何给定时间引发事件