大多数编译器使用优化算法优化代码,这些优化算法依赖于启发式(基于经验的技术)和近似值。下面的代码将进入控制流分析。我运行了很多程序示例
案例 A) if-else with final 变量 - 编译器抛出警告死代码。生成的字节码没有任何 if-else 语句。
public static void main(java.lang.String[])
Stack=1, Locals=2, Args_size=1
0: iconst_0
1: istore_1
2: return
LineNumberTable:
line 42: 0
line 54: 2
LocalVariableTable:
Start Length Slot Name Signature
0 3 0 args [Ljava/lang/String;
2 1 1 selection I
}
案例 B)没有最终变量的 if-else - 没有编译器错误,但也没有代码优化。
final int selection i=100; //case A
//int selection i=100; //case B
if(selection==1){
System.out.println("Hi");
}else if(selection==2){
}else{
}
案例 C) if-else 带有最终变量,但 if-else 语句放在另一种方法中说
computeIfLese(int selection)
- 没有进行代码优化,因为该方法可以被具有不同参数值的其他实例调用(显然)。
由于编译器优化技术是基于启发式的,所以会出现这种情况,但谁会想到最罕见的情况。
等待 Java 众神的评论... :)
这是 Compiler 没有对此进行优化的活生生的证明。检查标签 5:
public static void main(java.lang.String[]);
Code:
Stack=2, Locals=2, Args_size=1
0: bipush 100
2: istore_1
3: bipush 100
5: lookupswitch{ //2
200: 32;
300: 40;
default: 48 }
32: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream;
35: ldc #22; //String 200
37: invokevirtual #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
40: getstatic #16; //Field java/lang/System.out:Ljava/io/PrintStream;
43: ldc #30; //String 300
45: invokevirtual #24; //Method java/io/PrintStream.println:(Ljava/lang/String;)V
48: return
LineNumberTable:
line 11: 0
line 15: 3
line 17: 32
line 18: 40
line 21: 48
LocalVariableTable:
Start Length Slot Name Signature
0 49 0 args [Ljava/lang/String;
3 46 1 selection I
StackMapTable: number_of_entries = 3
frame_type = 252 /* append */
offset_delta = 32
locals = [ int ]
frame_type = 7 /* same */
frame_type = 7 /* same */
}