考虑一个非常简单的人为设计代码:
public class TestJavap {
public static void main(String[] args) {
int a = 3;
int b = 7;
}
}
javap产生了这个:
public static void main(java.lang.String[]);
Code:
0: iconst_3
1: istore_1
2: bipush 7
4: istore_2
5: return
为什么编译器会为非常相似的字段a
和b
生成不同的字节代码。两者都是用常量文字初始化的整数类型。
对于a
,它通过iconst_3
从池中获取常量,然后通过istore_1
将其存储在变量中,而对于b,它使用完全不同的机制({{1的组合}和bipush
)。
答案 0 :(得分:7)
why the compiler is producing different byte code for very similar fields a and b
使用整数-1
- 5
iconst_x
(x是0到5之间的数字),它已经是一个常数字节码。< / p>
iconst_m1 02 → -1 load the int value -1 onto the stack
iconst_0 03 → 0 load the int value 0 onto the stack
iconst_1 04 → 1 load the int value 1 onto the stack
iconst_2 05 → 2 load the int value 2 onto the stack
iconst_3 06 → 3 load the int value 3 onto the stack
iconst_4 07 → 4 load the int value 4 onto the stack
iconst_5 08 → 5 load the int value 5 onto the stack
因此,如果数字不是iconst_
字节码的常量值,那么它将使用bipush
字节码。
有关list of java bytecode&amp;&amp;的更多信息JVMS