2009-02-11 15 views
7

In C, kann ich ein Register für eine Variable, zum Beispiel zuteilen:Java-Äquivalent von Register int?

register int i = 0; 

Ich bin mir bewusst, dass Java eine interpretierte Sprache ist, und viele viele Abstraktionen von der CPU ist.

Gibt es irgendeinen Mechanismus, der sogar verlangt (und wenn die Architektur es nicht erlaubt, also was), dass meine Variable in einem Register verbleibt, anstatt in den Cache oder Hauptspeicher zu wechseln?

Ich glaube nicht, dass es einen Weg gibt, aber ich war zuvor angenehm überrascht.

Danke,

+1

"Register" in C ist völlig nutzlos, und seit mindestens einem Jahrzehnt. Der Optimierer benötigt keine Hinweise. –

+0

"interpretierte Sprache". Interpreter ist eine Eigenschaft des Sprachsystems, nicht die Sprache. Die meiste (für eine geeignete Definition) Java ausgeführt wird kompiliert. –

Antwort

3

Nein, es gibt keine Möglichkeit, dies in Java anzufordern. Es gibt jedoch einige Dinge, die Sie tun können, die verhindern, dass ein Register verwendet wird, z. B. das Anwenden des Modifikators volatile auf eine Elementvariable.

+0

Register würde nur für eine lokale Variable (oder Parameter) gelten. Java volatile ist für beide nicht anwendbar. IIRC, welches Register verhindert eigentlich, dass eine Referenz zu einer Variablen genommen wurde, was Java ohnehin nicht tut. –

+0

Versetzt HotSpot jemals den Wert einer Mitgliedsvariablen in ein Register? Ich dachte, dass "volatile" teilweise benötigt wurde, um sicherzustellen, dass Änderungen an einem (Kopie eines) Wertes in einem Register in den Hauptspeicher geschoben wurden. – erickson

+1

volatile garantiert nur, dass alle Threads die neueste Version anzeigen. Es gibt keine Garantie, dass es nicht in ein Register geladen wird. Diese Thread-Sichtbarkeit ist vollständig der JVM überlassen. –

18

register in C keine Variable registrieren setzen. Es gibt dem Compiler einfach den Hinweis, dass es wahrscheinlich gut wäre, ihn in ein Register zu schreiben.

In Java gibt es kein Äquivalent.

6

Wenn es genug in einem kurzen Raum verwendet wird, dass es ein Register int wert wäre, dann sollte der Hotspot-Compiler in der Lage sein, das selbst herauszufinden.

Tatsächlich sollte der Hotspot-Compiler eine bessere Arbeit leisten können als der C/C++ - Compiler, da er mehr Informationen enthält, mit denen er arbeiten kann. C/C++ - Compiler müssen raten; HotSpot kann messen.

5

Es gibt keine Entsprechung in Java. Selbst in C gibt es keine Garantie, dass die Variable in einem Register gespeichert wird, und Compiler können sie ignorieren.

In Java wird die Methode interpretiert, bis der Hotspot-JIT heuristisch feststellt, dass sie kompiliert werden muss. Für den kompilierten Code verwendet er einen Farbalgorithmus, um Variablen und temporäre Werte zu Registern zuzuweisen oder im Falle eines Registerüberlaufs in/aus dem RAM zu schreiben.

3

Ich bin mir bewusst, dass Java ist eine interpretierte Sprache und ist viele, viele Abstraktionen von der CPU entfernt.

Sie so ziemlich Ihre eigene Frage dort beantwortet :-)

Aber im Ernst, im Allgemeinen, schreiben Sie Ihren Code so klar und einfach wie möglich, und die JVM wird tun, was sie können, um Ihren Code zu behandeln Recht.

0

Sie können eine Anmerkung mit dem Namen @register erstellen, die JVM ignoriert sie jedoch. z.B.

@register int i = 0;