为什么Javaconstant_pool内存分配定义为大小constant_pool_count-1

问题描述 投票:0回答:2

java 类定义 (docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html) 如下所示:

ClassFile {
    u4             magic;
    u2             minor_version;
    u2             major_version;
    u2             constant_pool_count;
    cp_info        constant_pool[constant_pool_count-1];
    u2             access_flags;
    u2             this_class;
    u2             super_class;
    u2             interfaces_count;
    u2             interfaces[interfaces_count];
    u2             fields_count;
    field_info     fields[fields_count];
    u2             methods_count;
    method_info    methods[methods_count];
    u2             attributes_count;
    attribute_info attributes[attributes_count];
}

但是为什么constant_pool的计算结果是constant_pool_count-1呢?为什么减少了1?我希望它是constant_pool[constant_pool_count]而不是constant_pool[constant_pool_count-1]。

java class jvm .class-file
2个回答
2
投票

因为根据您发布的文档:

constant_pool_count项的值等于constant_pool表中的条目数加一

因此

constant_pool[constant_pool_count]
会导致索引无效。

至于背后的原因——我只能在这里猜测。大概是因为选择了以

1
开头的索引而不是
0


1
投票

可以看到,constant_pool是从1开始索引的,而不是0,这有点违反常理,但是这是为了“不引用任何常量值项”的意思,对于指向a中常量池索引值的数据特殊情况,可以用索引值0

来表示
© www.soinside.com 2019 - 2024. All rights reserved.