2013-06-10 7 views
5

Sto leggendo C# in profondità da Jon Skeet. Citando dal terzo capitolo:In che modo il compilatore JIT considera i tipi di valore?

Il JIT può trattare tipi di valore in modo particolarmente intelligente che riesce a eliminare la boxe e unboxing in molte situazioni. In alcuni casi , questo può fare un'enorme differenza in termini di prestazioni sia in termini di velocità della memoria che di consumo di memoria.

Qualcuno potrebbe spiegare cosa significa esattamente, preferibilmente con un esempio?

+1

'Jon' not' John' :) –

+0

* Boxing * descrive il processo di salvataggio di un tipo di valore come 'oggetto', ad esempio:' oggetto o = 13; ', mentre * unboxing * descrive il processo di recupero il valore dall'oggetto: 'int thirteen = (int) o;'. E 'quello che volevi sapere? – Nolonar

+1

NO. Voglio il significato preciso dell'affermazione di cui sopra "Il JIT può trattare i tipi di valore in un modo particolarmente intelligente che riesce a eliminare il pugilato e l'unboxing in molte situazioni.In alcuni casi, questo può fare un'enorme differenza in termini di prestazioni in termini di velocità e il consumo di memoria. " – amitabha

risposta

1

Prendiamo come esempio List<int>. Questo è supportato da un autentico int[] e JIT compilerà il codice JIT in modo specifico per l'argomento di tipo int, in modo che qualsiasi codice che utilizza uno T all'interno di List<T> dovrebbe ottenere ottimizzazioni come se il codice fosse stato scritto solo per per i numeri interi.

confronta questo con i generici di Java, in cui gli unici argomenti di tipo validi sono tipi di classe - così anche se è valida per scrivere:

// Java code! 
List<Integer> integers = new ArrayList<Integer>(); 
integers.add(10); 
int x = integers.get(0); // x = 10 

che esegue un incontro di boxe e il funzionamento unboxing in background. Il codice C# equivalente non comporterebbe affatto la boxe.

+0

Molte molte grazie Jon .Ma Jon potrebbe essersi lamentato più dettagliatamente della linea sotto menzionata. La linea è: in modo che qualsiasi codice che utilizza una T all'interno dell'elenco ottenga le ottimizzazioni come se il codice fosse stato scritto solo per i numeri interi. – amitabha

0

Penso che Jon di molti di questi tipi non siano trattati come oggetti del suo tipo di definizione. Per esempio; un int non deve essere trattato come una struct e può essere gestito direttamente nei registri. L'aggiunta di due numeri interi non è gestita da chiamate operatore sovraccaricate ma eseguita direttamente da cpu.

Problemi correlati