首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >有效不可用常量池索引

有效不可用常量池索引
EN

Stack Overflow用户
提问于 2017-01-09 04:27:07
回答 1查看 180关注 0票数 2

我可以在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的内容无效。

这是否意味着“有效”=“您可以存储在其中”,以及“不可用”=“您不能加载它”?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-09 16:22:02

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

第一个引文谈到常量池,顾名思义,它是恒定的。你不能储存在恒定的水池里。例如,短语“constant_pool索引n+1必须有效”意味着,如果池的最后一个条目是longdouble常量,则仍然必须声明池足够大,以容纳两个条目,尽管第二个条目不可用。我不知道任何其他实际的结果,所以这主要是一种正式的声明,暗示有一个连续的有效指数范围,虽然其中一些是无法读取的。

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

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41541036

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档