2009-02-11 6 views
7

En C, je peux attribuer un registre pour une variable, par exemple:Java équivalent du registre int?

register int i = 0; 

Je sais que Java est un langage interprété, et beaucoup d'abstractions loin de la CPU.

Y at-il un mécanisme disponible pour demander même (et si l'architecture ne le permet pas, et alors) que ma variable reste dans un registre au lieu de passer au cache ou à la mémoire principale?

Je ne pense pas qu'il y ait un moyen, mais j'ai été agréablement surpris avant.

Merci,

+1

"registre" dans C est totalement inutile, et a été pendant au moins une décennie. L'optimiseur n'a pas besoin de conseils. –

+0

"langage interprété". L'interprète est une propriété du système linguistique, pas la langue. La plupart (pour une définition appropriée) Java exécuté est compilé. –

Répondre

3

Non, il n'y a aucun moyen de demander cela en Java. Cependant, il y a certaines choses que vous pouvez faire qui empêcheront l'utilisation d'un registre, comme l'application du modificateur volatile à une variable membre.

+0

Le registre ne s'appliquerait qu'à une variable locale (ou un paramètre). Java volatile n'est pas applicable à l'un ou l'autre. IIRC, quel registre empêche-t-il réellement une référence à une variable, ce que Java ne fait pas de toute façon. –

+0

HotSpot met-il en cache la valeur d'une variable membre dans un registre? Je pensais que «volatil» était nécessaire, en partie, pour s'assurer que les changements à une (copie d'une) valeur dans un registre ont été poussés vers la mémoire principale. – erickson

+1

volatile garantit uniquement que tous les threads verront la dernière version. Il n'y a aucune garantie qu'il ne sera pas chargé dans un registre. Cette visibilité de thread est entièrement laissée à la JVM. –

18

register en C ne met pas une variable pour vous inscrire. Cela donne simplement l'indice au compilateur, qu'il serait probablement bon de le mettre dans un registre.

En Java, il n'y a pas d'équivalent.

6

S'il est utilisé suffisamment dans un espace court, il serait intéressant d'en faire un registre int, alors le compilateur hotspot devrait être capable de le comprendre lui-même.

En fait, le compilateur de hotspot devrait être capable de faire un meilleur travail que le compilateur C/C++, car il a plus d'informations à utiliser. Les compilateurs C/C++ doivent deviner; HotSpot peut mesurer.

5

Il n'y a pas d'équivalent en Java. Même en C il n'y a aucune garantie que la variable sera stockée dans un registre et les compilateurs sont libres de l'ignorer.

En Java, la méthode sera interprétée jusqu'à ce que le JIT hotspot détermine de manière heuristique qu'il doit être compilé. Pour le code compilé, il utilise un algorithme de coloration pour assigner des variables et des valeurs temporaires aux registres, ou écrire dans/de la RAM en cas de dépassement de registre.

3

Je sais que Java est un langage interprété , et beaucoup, beaucoup abstractions loin de la CPU.

Vous assez bien répondu à votre propre question :-) il

Mais sérieusement, en général, écrivez votre code aussi clairement et simplement que vous le pouvez, et la machine virtuelle Java fera ce qu'il peut pour traiter votre code droite.

0

Vous pouvez créer une annotation appelée @register mais la JVM l'ignorera définitivement. par exemple.

@register int i = 0;