我可以在JVM文档中阅读以下内容:
所有8字节常量都占用类文件的constant_pool表中的两个条目。如果CONSTANT_Long_info或CONSTANT_Double_info结构是CONSTANT_pool表中索引n处的项,则池中的下一个可用项位于索引n+2处。constant_pool索引n+1必须有效,但被认为不可用。
回想起来,制作8字节常量需要两个常量池条目这是一个糟糕的选择。
如果索引n+1有效,它怎么会"不可用"?此外,它似乎并不是完全不可用的,因为它可以存储一个值:
类型为long或类型为double的值占用两个连续的局部变量。这样的值只能使用较小的索引来处理。例如,存储在索引n处的局部变量数组中的类型为double的值实际上占用了索引为n和n+1的局部变量;但是,无法从加载索引n+1处的局部变量。它可以存储到中。然而,这样做会使局部变量n的内容无效。
这是否意味着"有效"="您可以存储到其中",而"不可用"="无法加载"?
您正在混合常量池和局部变量。
第一个引用谈到了常量池,顾名思义,它是常量。你不能存储到常量池中。短语">常量池索引n+1必须有效"意味着,例如,如果池的最后一个条目是long
或double
常量,则仍然必须声明池足够大以容纳两个条目,尽管第二个条目不可用。我不知道有任何其他实际后果,所以这主要是一个正式的声明,暗示有一系列连续的有效索引,尽管其中一些索引是无法读取的。
你第二次引用的局部变量是关于局部变量的,这是另一回事。可以写入局部变量,并且写入的值不需要与前一个类型相同,唯一的要求是后续读取适用于变量的当前类型,即最近写入的值。因此,即使之前在n处有long
或double
类型的值,也可以写入索引n+1,尽管这意味着之后在n处没有有效值,只有n+1处的新值。