指令 istore 是否从 main 方法中的索引 1 开始?
Does the instruction istore start at index 1 in the main method?
给定指令 istore_<n>
及其 documentation:
n must be an index into the local variable array of the current frame (§2.6).
它没有指定它从哪个索引开始。我假设为 0。对于给定的 istore 操作,它应该递增 1。
给出一个简单的class:
public class TestingStuff {
public static void main(String[] args) {
int a = 11;
int b = 12;
}
public static void test() {
int c = 13;
int d = 14;
}
}
我希望这两种方法有不同的框架。这意味着存储 a
和 b
的指令将是 istore_0
和 istore_1
。以及用于存储 c
和 d
的相同索引。但是由于某些原因,main 方法中的索引从 1
开始。这似乎总是如此。但我找不到任何关于原因的信息。
javap 的输出:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=3, args_size=1
0: bipush 11
2: istore_1
3: bipush 12
5: istore_2
6: return
public static void test();
descriptor: ()V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=2, args_size=0
0: bipush 13
2: istore_0
3: bipush 14
5: istore_1
6: return
是这样吗?如果是,为什么?
静态方法的参数在作为局部变量从位置0开始传递。因此,对于main
,args
数组位于位置 0 的局部变量中。编译使用 args
执行某些操作的代码应该证明这一点,尽管我手边没有编译器。
(实例方法,this
在位置0,然后其余参数从位置1开始。)
详情见section 2.6.1。
给定指令 istore_<n>
及其 documentation:
n must be an index into the local variable array of the current frame (§2.6).
它没有指定它从哪个索引开始。我假设为 0。对于给定的 istore 操作,它应该递增 1。
给出一个简单的class:
public class TestingStuff {
public static void main(String[] args) {
int a = 11;
int b = 12;
}
public static void test() {
int c = 13;
int d = 14;
}
}
我希望这两种方法有不同的框架。这意味着存储 a
和 b
的指令将是 istore_0
和 istore_1
。以及用于存储 c
和 d
的相同索引。但是由于某些原因,main 方法中的索引从 1
开始。这似乎总是如此。但我找不到任何关于原因的信息。
javap 的输出:
public static void main(java.lang.String[]);
descriptor: ([Ljava/lang/String;)V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=3, args_size=1
0: bipush 11
2: istore_1
3: bipush 12
5: istore_2
6: return
public static void test();
descriptor: ()V
flags: ACC_PUBLIC, ACC_STATIC
Code:
stack=1, locals=2, args_size=0
0: bipush 13
2: istore_0
3: bipush 14
5: istore_1
6: return
是这样吗?如果是,为什么?
静态方法的参数在作为局部变量从位置0开始传递。因此,对于main
,args
数组位于位置 0 的局部变量中。编译使用 args
执行某些操作的代码应该证明这一点,尽管我手边没有编译器。
(实例方法,this
在位置0,然后其余参数从位置1开始。)
详情见section 2.6.1。