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"?
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
@ 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
@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