2017-01-09 5 views
1

Ich kann die folgenden in der JVM-Dokumentation lesen:Valid unbrauchbar constant pool Index

Alle 8-Byte-Konstanten nehmen zwei Einträge in der Tabelle constant_pool der Klassendatei. Wenn eine Struktur CONSTANT_Long_info oder CONSTANT_Double_info das Element in der Tabelle constant_pool am Index n ist, befindet sich das nächste verwendbare Element im Pool am Index n + 2. Der Konstantenpool-Index n + 1 muss gültig sein, wird jedoch als unbrauchbar betrachtet.

Im Rückblick, 8-Byte-Konstanten nehmen zwei konstante Pool-Einträge war eine schlechte Wahl.

Wenn der Index n + 1 gültig ist, wie kann er "unbrauchbar" sein? Außerdem scheint es nicht vollständig unbrauchbar zu sein, da es möglich ist, einen Wert darin zu speichern:

Ein Wert des Typs long oder double belegt zwei aufeinanderfolgende lokale Variablen. Ein solcher Wert kann nur mit dem kleineren Index adressiert werden. Zum Beispiel belegt ein Wert des Typs double, der in der lokalen Variablenmatrix am Index n gespeichert ist, tatsächlich die lokalen Variablen mit Indizes n und n + 1; Die lokale Variable mit dem Index n + 1 kann jedoch nicht geladen werden. Es kann in gespeichert werden. Dies macht jedoch den Inhalt der lokalen Variablen n ungültig.

Bedeutet das, dass "gültig" = "Sie können darin speichern" und "unbrauchbar" = "Sie können es nicht laden"?

Antwort

2

Sie vermischen die konstanten Pool- und lokalen Variablen.

Der erste Cite spricht über den konstanten Pool, der, wie der Name schon sagt, konstant ist. Sie können nicht in den konstanten Pool speichern. Der Ausdruck "der Konstantenpool-Index n + 1 muss gültig sein" impliziert beispielsweise, dass, wenn der letzte Eintrag des Pools eine oder double Konstante ist, Sie immer noch den Pool groß genug erklären müssen, um beide Einträge zu halten das zweite ist nicht verwendbar. Ich kenne keine anderen praktischen Konsequenzen, daher ist es hauptsächlich eine formale Aussage, die impliziert, dass es einen zusammenhängenden Bereich von gültigen Indizes gibt, obwohl einige von ihnen nicht gelesen werden können.

Lokale Variablen, über die Ihre zweite Aussage spricht, sind eine andere Sache. Lokale Variablen können geschrieben werden, und der Wert, der geschrieben wird, muss nicht vom gleichen Typ wie der vorherige sein, die einzige Anforderung ist, dass nachfolgende Lesevorgänge für den aktuellen Typ der Variablen, d. H. Den zuletzt geschriebenen Wert, geeignet sind. So können Sie zum Index n +1 selbst schreiben, wenn zuvor ein Wert vom Typ war long oder double bei n, obwohl das bedeutet, dass es bei n danach kein gültiger Wert ist, wird nur der neue Wert bei n +1.

+0

Macht Sinn, obwohl ich immer noch nicht den Punkt sehe, dass der Index n + 1 gültig sein muss. In meinem Sinn spielt die Existenz dieses Indexes oder die Zusammenhängigkeit der Pooleinträge im Speicher keine Rolle, solange die JVM das richtige Verhalten hat. – Codoscope

+0

@ Qu'est-cet'yont Der Punkt, der sagt, dass der Index n + 1 gültig sein muss, ist so, dass Sie kein Long oder Double am Index n-1 haben können, wobei n die Größe des konstanten Pools ist. Es muss höchstens n-2 sein. – Antimony

+1

@Antimony: das ist nur eine andere Formulierung für "erklären Sie den Pool groß genug, um beide Einträge zu halten", aber es scheint keine andere Konsequenz zu geben, die tatsächlich die Frage aufwirft, warum sie diese Formulierung gewählt haben. Um dies noch verwirrender zu machen, verwenden sie eine andere "Gültigkeit" in §4.1, wo sie sagen "* Ein constant_pool-Index gilt als gültig, wenn es größer als Null ist und kleiner als constant_pool_count, mit der Ausnahme für Konstanten des Typs lang und doppelt in §4.4.5. *", Den Eindruck, dass diese Konstanten kann ungültige Indizes verursachen. Alles in allem bereuen sie diese Wahl trotzdem ... – Holger