2009-11-21 25 views
14

Ich versuche, Java-Bytecode zu lernen, und ich stolperte über dieses: ich diesen sehr einfachen Code mit dem -g Option kompiliert:Lokale Variablen in Java-Bytecode

public class Test 
{ 
public static void main(String args[]) 
{ 
    double a = 1.0; 
    int b = (int)a; 
} 
} 

Der Hauptcode entpuppte:

0 dconst_1 
1 dstore_1 
2 dload_1 
3 d2i 
4 istore_3 
5 return 

Darüber hinaus ist die maximale lokale Variablen main 4, und die LocalVariableTable hat nur 3 Einträge (args, a, b). Ich bin neugierig zu wissen, warum der Compiler 4 lokale Variablen reserviert, während es eindeutig nur 3 ist, und localvariable[2] wird nicht verwendet. Gibt es etwas, das mir fehlt? Danke

Antwort

24

es ist 4, weil lange und doppelte 2 aufeinander folgende Einträge im Rahmen belegt. Dies wird eindeutig durch die Java JVM specification angegeben:

Ein Wert vom Typ long oder Typ Doppel belegt zwei aufeinander folgende lokale Variablen. Ein solcher Wert darf nur mit dem kleineren Index adressiert werden. Für Beispiel, ein Wert des Typs double gespeichert in der lokalen Variablen-Array bei Index n tatsächlich besetzt die lokalen Variablen mit Indizes n und n +1; Die lokale Variable am Index n +1 kann jedoch nicht geladen werden. Es kann in gespeichert werden. Dies macht jedoch den Inhalt der lokalen Variablen n ungültig.

4

Ich weiß, Java-Bytecode nicht, das ist nur eine Vermutung:

Könnte es mit der Tatsache zu tun hat, dass a ein double ist? Sind zwei Wörter dafür reserviert?