2010-07-13 49 views
8

我正在爲C#中的DirectX 3D引擎開發數學庫。我正在使用SlimDX,這是一個非常有用的強大的庫。 SlimDX提供了相當多的數學類,但它們實際上是圍繞本機D3DX對象的包裝器,所以雖然對象本身非常快,但互操作並不是我想的,因爲我的託管C#代碼勝過它們。C中的內聯擴展#

我的具體問題與浮點比較有關。該整理的典型方式是定義的ε值,和值比較的差異浮點值之間確定親近,就像這樣:

float Epsilon = 1.0e-6f; 
bool FloatEq(float a, float b) 
{ 
    return Math.Abs(a - b) < Epsilon 
} 

函數調用的開銷將淹沒實際比較,所以這個簡單的函數會在C++中內聯,C#編譯器會這樣做嗎?有沒有辦法告訴C#編譯器我想要一個內聯的方法?

回答

7

C#編譯器不執行內聯 - 但JIT在這種情況下可能會這樣做。如果有的話,這當然是執行內聯的部分。

編輯:我會期望這是內聯在這種情況下,但很難說沒有加載代碼到類似cordbg的東西開啓JIT優化。每種不同的CLR版本可能對內聯有不同的調整(包括64位和32位CLR),所以我不願意說任何明確的內容。

+1

的JIT可以相當聰明約內聯,當調試器外運行。例如,它可以內聯「Math.Abs​​」方法本身。 – 2010-07-13 11:16:45

+0

現在的問題是:在這種情況下(假設優化代碼和沒有調試器),它會嗎? – Mau 2010-07-13 11:17:38

+0

@Mau:編輯... – 2010-07-13 11:24:02