2

我可以在 JVM 文档中阅读以下内容:

所有 8 字节常量在类文件的 constant_pool 表中占据两个条目。如果 CONSTANT_Long_info 或 CONSTANT_Double_info 结构是索引 n 处的 constant_pool 表中的项,则池中的下一个可用项位于索引 n+2 处。constant_pool 索引 n+1 必须有效但被视为不可用。

回想起来,让 8 字节常量占用两个常量池条目是一个糟糕的选择。

如果索引 n+1 有效,它怎么会“不可用”呢?此外,它似乎并非完全不可用,因为可以将值存储到其中:

long 或 double 类型的值占用两个连续的局部变量。这样的值只能使用较小的索引来解决。例如,存储在索引 n 处的局部变量数组中的 double 类型的值实际上占用了索引为 n 和 n+1 的局部变量;但是,不能从中加载索引 n+1 处的局部变量。可以存入。但是,这样做会使局部变量 n 的内容无效。

这是否意味着“有效”=“您可以存储到其中”和“不可用”=“您无法加载”?

4

1 回答 1

2

您正在混淆常量池和局部变量。

第一个引用谈到了常量池,顾名思义,常量池。您不能存储到常量池中。短语“<em>constant_pool index n+1 must be valid”意味着,例如,如果池的最后一个条目是 alongdouble常量,您仍然必须声明池足够大以容纳两个条目,尽管第二个不可用。我不知道任何其他实际后果,因此它主要是一个正式声明,暗示存在连续范围的有效索引,尽管其中一些无法读取。

您第二次引用的局部变量是另一回事。局部变量可以被写入,并且被写入的值不需要与之前的类型相同,唯一的要求是后续读取适合变量的当前类型,即最近写入的值。因此,即使先前存在 type或n的值,您也可以写入索引n +1 ,尽管这意味着之后n处没有有效值,只有n +1 处的新值。longdouble

于 2017-01-09T16:22:02.770 回答