2010-07-13 32 views
8

Sto lavorando su una libreria matematica per il mio motore DirectX 3D in C#. Sto usando SlimDX, che è un meraviglioso insieme e una potente libreria. SlimDX offre un bel po 'di classi matematiche, ma in realtà sono wrapper attorno agli oggetti D3DX nativi, quindi mentre gli oggetti stessi sono molto, molto veloci, l'interop non è presumo, perché il mio codice C# gestito li supera.Espansione in linea in C#

La mia domanda specifica ha a che fare con il confronto in virgola mobile. Il tipo-di modo canonico è quello di definire un valore epsilon, e confrontare il valore alla differenza tra i valori in virgola mobile per determinare la vicinanza, così:

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

la funzione di chiamata testa sarebbe sommergere il confronto effettivo, quindi questa banale funzione sarebbe inline in C++, il compilatore C# farà questo? C'è un modo per dire al compilatore C# che voglio un metodo inline?

risposta

7

Il compilatore C# non esegue inline - ma la squadra può anche fare così in questo caso. Questo è certamente il pezzo che eseguirà inlining, semmai.

EDIT: Vorrei aspetterebbe a inline in questo caso, ma è difficile dire senza caricare il codice in qualcosa di simile CorDbg con le ottimizzazioni JIT acceso. Ogni versione CLR diversa potrebbe avere diversi aggiustamenti alla sua inlining (inclusi i CLR a 64 bit contro 32 bit) quindi sono riluttante a dire qualcosa di troppo definito.

+1

Il SIC può essere abbastanza intelligente circa inlining, quando esegue il debugger. Ad esempio, può incorporare il metodo 'Math.Abs' stesso. –

+0

Ora la domanda è: WILL IT in questo caso (assumendo codice ottimizzato e nessun debugger)? – Mau

+0

@Mau: Modifica ... –