2011-05-08 66 views
6

我正在查看.NET Framework的String類的Equals方法實現,並發現它使用了EqualsHelper方法。我發現,這真是一個非常酷的和有效的方法,但有一些非常weired我發現,爲什麼他們通過除法運算遞增指針(或進行偏移),如:查看.NET框架中的EqualsHelper方法

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

謝謝!

+0

我在'String.EqualsHelper'方法中看不到這段代碼。你正在檢查什麼版本的.NET Framework源代碼? – 2011-05-08 13:20:02

+0

@Code Grey:.NET 4.0。 – sherifzain 2011-05-08 13:42:34

回答

10

啊,我沒有看到你在說什麼的原因是你正在查看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時,會錯過許多有趣的事情。不是其中的評論。想想,我已經看到有人在這裏爭辯說,在寫得很好的代碼中不需要評論!

+0

+1有一個很好的答案和*想想,我已經看到人們在這裏爭辯說,在寫得很好的代碼中不需要評論!*。有時候正確的代碼不可能是微不足道的,需要一些解釋。 – 2011-05-08 16:05:11