我可以在JVM文档中阅读以下内容:
所有8字节常量都占用类文件的constant_pool表中的两个条目。如果CONSTANT_Long_info或CONSTANT_Double_info结构是索引n处的constant_pool表中的项,则池中的下一个可用项位于索引n+2。constant_pool索引n+1必须有效,但被认为不可用。 回想起来,让8字节常量使用两个常量池条目是一个糟糕的选择。
如果索引n+1是有效的,那么它如何“不可用”?此外,它似乎并非完全不可用,因为可以将一个值存储到其中:
长类型或双类型类型的值占据两个连续的局部变量。这样的值只能使用较小的索引来处理。例如,存储在索引n处局部变量数组中的类型double的值实际上占用了索引n和n+1的局部变量;但是,无法从索引n+1处加载局部变量。它可以储存在。但是,这样做会使局部变量n的内容无效。
这是否意味着“有效”=“您可以存储在其中”,以及“不可用”=“您不能加载它”?
发布于 2017-01-09 16:22:02
您正在混合常量池和局部变量。
第一个引文谈到常量池,顾名思义,它是恒定的。你不能储存在恒定的水池里。例如,短语“constant_pool索引n+1必须有效”意味着,如果池的最后一个条目是long或double常量,则仍然必须声明池足够大,以容纳两个条目,尽管第二个条目不可用。我不知道任何其他实际的结果,所以这主要是一种正式的声明,暗示有一个连续的有效指数范围,虽然其中一些是无法读取的。
局部变量,你的第二个引用是关于,是另一回事。可以写入局部变量,并且写入的值不需要与前面的类型相同,唯一的要求是后续读取适合于变量的当前类型,即最近编写的值。因此,您可以写入索引n+1,即使以前在n处有一个类型为long或double的值,尽管这意味着之后在n处没有有效值,只有在n+1处的新值。
https://stackoverflow.com/questions/41541036
复制相似问题