2009-02-11 17 views
7

In C, mi può allocare un registro per una variabile, ad esempio:equivalente Java del registro int?

register int i = 0; 

Sono consapevole del fatto che Java è un linguaggio interpretato, ed è molte molte astrazioni di distanza dalla CPU.

Esiste qualche meccanismo disponibile per richiedere (e se l'architettura non lo consente, quindi cosa) che la mia variabile rimane in un registro invece di spostarsi nella cache o nella memoria principale?

Suppongo che non ci sia alcun modo, ma sono stato piacevolmente sorpreso prima.

Grazie,

+1

"registro" in C è assolutamente inutile, ed è stato per almeno un decennio. L'ottimizzatore non ha bisogno di suggerimenti. –

+0

"linguaggio interpretato". L'interprete è una proprietà del sistema linguistico, non della lingua. La maggior parte (per una definizione appropriata) eseguita da Java è compilata. Il registro –

risposta

3

No, non c'è modo di richiederlo in Java. Tuttavia, ci sono alcune cose che puoi fare che impediranno l'utilizzo di un registro, come ad esempio l'applicazione del modificatore volatile a una variabile membro.

+0

si applica solo a una variabile locale (o parametro). La volatilità di Java non è applicabile a nessuno dei due. IIRC, quale registro effettivamente impedisce che sia stato preso un riferimento a una variabile, che Java non fa comunque. –

+0

HotSpot memorizza mai nel cache il valore di una variabile membro in un registro? Ho pensato che "volatile" fosse necessario, in parte, per garantire che le modifiche a un valore (copia di un) in un registro venissero trasferite nella memoria principale. – erickson

+1

volatile garantisce solo che tutti i thread vedano l'ultima versione. Non c'è alcuna garanzia che non verrà caricato in un registro. La visibilità del thread è completamente lasciata alla JVM. –

18

register in C non mette una variabile per la registrazione. Fornisce semplicemente al compilatore il suggerimento, che sarebbe probabilmente utile inserirlo in un registro.

In Java non esiste un equivalente.

6

Se è usato abbastanza in un breve spazio che ne valga la pena fare un registro int, allora il compilatore di hotspot dovrebbe essere in grado di capirlo da solo.

Infatti, il compilatore di hotspot dovrebbe essere in grado di fare un lavoro migliore rispetto al compilatore C/C++, perché ha più informazioni su cui lavorare. I compilatori C/C++ devono indovinare; HotSpot può misurare.

5

Non c'è equivalente in Java. Anche in C non vi è alcuna garanzia che la variabile venga memorizzata in un registro e che i compilatori siano liberi di ignorarla.

In Java, il metodo verrà interpretato fino a quando il JIT dell'hotspot determina euristicamente che deve essere compilato. Per il codice compilato utilizza un algoritmo di colorazione per assegnare variabili e valori temporanei ai registri o scrivere su/da RAM in caso di overflow del registro.

3

Sono consapevole che Java è un interpretato lingua, ed è molti molti astrazioni di distanza dalla CPU.

È praticamente risposto alla tua domanda c'è :-)

Ma sul serio, in generale, scrive il codice nel modo più chiaro e semplice possibile, e la JVM farà il possibile per trattare il codice destra.

0

È possibile creare un'annotazione chiamata @register ma la JVM la ignorerà sicuramente. ad es.

@register int i = 0;