switch-case的编译问题

nickysad007 2008-10-28 02:10:59
以下代码,用eclipes编译后反编译,发现会自动补齐,没有出现的case数字:
public int method(int arg){
int ret = 0;
switch(arg){
case 1:
ret = 1;
break;
case 3:
ret = 3;
break;
case 7:
ret = 1;
break;
case 9:
ret = 1;
break;
case 11:
ret = 1;
break;
default:
ret = 12
break;
}
return ret;
}
编译后:
public int method(int arg){
int ret = 0;
switch(arg){
case 1:
ret = 1;
break;
case 3:
ret = 3;
break;
case 7:
ret = 7;
break;
case 9:
ret = 9;
break;
case 11:
ret = 11;
break;
case 2:
case 4:
case 5:
case 6:
case 8:
case 10:
default:
ret = 12
break;
}
return ret;
}

有的时候就不会出现这种补齐状况,请问这是什么原因,有什么规律么?
谢谢。
...全文
233 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
猪⑩戒 2008-10-28
  • 打赏
  • 举报
回复
长见识啦。。。
wonflay 2008-10-28
  • 打赏
  • 举报
回复
nickysad007 2008-10-28
  • 打赏
  • 举报
回复
看起来确实是JAVA编译器作的优化,查到了几篇文章,有些帮助:
http://blog.chinaunix.net/u1/46723/showart_1272331.html

http://simohayha.javaeye.com/blog/146825

http://simohayha.javaeye.com/blog/147072

我在做测试覆盖率,使用Cobertura的时候发现的这个问题,如果这样会多出来几个分支,测试覆盖率的统计结果就不准确了。我想这应该是这个东东的一个bug!:)
ZangXT 2008-10-28
  • 打赏
  • 举报
回复
这时编译器优化的地方,使用一个跳转表,避免了每一次通过从上到下的比较来进行。
如果不这样的话,那就需要像每次一个if else那种处理了
jxxx2967 2008-10-28
  • 打赏
  • 举报
回复
编译器优化吧
helei123a 2008-10-28
  • 打赏
  • 举报
回复
YL_Show 2008-10-28
  • 打赏
  • 举报
回复
Mark
nickysad007 2008-10-28
  • 打赏
  • 举报
回复
楼上的仁兄,我不太懂啊,上面的是汇编代码么?怎么编译出来的啊?:)真强!
ZangXT 2008-10-28
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 nickysad007 的回复:]
具体的没有查到,不过初步有点儿线索了,犯人应该和编译器把switch中的分支做成跳转表有一些关系!目前感觉是分支数大于5就会生成这张表,然后会把其中的补齐。更加详细的案情还不甚清楚,可以顺着这个线索继续调查,直到找到凶手为止!:)
[/Quote]
的确是发现一个分支表


public int method(int);
Code:
0: iconst_0
1: istore_2
2: iload_1
3: tableswitch{ //1 to 11
1: 60;
2: 85;
3: 65;
4: 85;
5: 85;
6: 85;
7: 70;
8: 85;
9: 75;
10: 85;
11: 80;
default: 85 }
60: iconst_1
61: istore_2
62: goto 88
65: iconst_3
66: istore_2
67: goto 88
70: iconst_1
71: istore_2
72: goto 88
75: iconst_1
76: istore_2
77: goto 88
80: iconst_1
81: istore_2
82: goto 88
85: bipush 12
87: istore_2
88: iload_2
89: ireturn
ZangXT 2008-10-28
  • 打赏
  • 举报
回复
mark
这个问题值得研究。
nickysad007 2008-10-28
  • 打赏
  • 举报
回复
具体的没有查到,不过初步有点儿线索了,犯人应该和编译器把switch中的分支做成跳转表有一些关系!目前感觉是分支数大于5就会生成这张表,然后会把其中的补齐。更加详细的案情还不甚清楚,可以顺着这个线索继续调查,直到找到凶手为止!:)
JJZHK 2008-10-28
  • 打赏
  • 举报
回复
up

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧