1.case情况 <= 3种,语句块较少
DEBUG
switch (argc)
{
case 0:
printf("case 0\n");
break;
case 1:
printf("case 1\n");
break;
case 2:
printf("case 2\n");
break;
}
printf("HelloWorld\n");
//直接一个一个比较跳转,中间没有代码块,这样的话匹配跳转执行的时候,如果没有break的话会继续向下执行,所以 switch case语句块之间一定要break
release
switch (argc)
{
case 10:
printf("case 0\n");
break;
case 5:
printf("case 1\n");
break;
case 8:
printf("case 2\n");
break;
}
printf("HelloWorld\n");
//指令优化,在看一下是否可以代码外提优化
2.case情况 > 3种,且最大值-最小值<=12
Release版和debug大致相同
/*
特征
编译器会给所有case情况做一个表
当提供的序号大于索引时,条件不匹配直接跳转至default(因为判断语句一般为无符号,所以不考虑负数的情况)
在索引内则查表完成跳转
*/
/*
case值+1了,如果case值+1=0对应的下标就是0,那case值就是-1 他会把case值和下标一一对应 生成如下
case值:-1 0 1 2 3 4 5 6 7
下标值: 0 1 2 3 4 5 6 7 8
这样一一对应,如果case值是条件是不匹配的的则对应的下标全部填默认的地址值
012A1089 46 inc esi 减法
012A108A 83 C4 04 add esp,4
012A108D 83 FE 08 cmp esi,8
012A1090 77 3E ja $LN18+88h (012A10D0h)
012A1092 FF 24 B5 10 11 2A 01 jmp dword ptr [esi*4+12A1110h]
*/
switch (argc)
{
case -1:
printf("case 0\n");
break;
case 1:
printf("case 1\n");
break;
case 2:
printf("case 2\n");
break;
case 3:
printf("case 3\n");
case 5:
printf("case 5\n");
break;
case 6:
printf("case 6\n");
break;
case 7:
printf("case 7\n");
break;
default:
printf("default \n");
break;
}
printf("HelloWorld\n");
3.case情况 > 3种,case值最大- 最小case < 255
/*
特征
编译器会生成两个表
下标表:下标表里记录了对应case地址表的下标
case地址表:记录case语句块的地址
*/
switch (argc)
{
case 22:
printf("case 0\n");
break;
case 20:
printf("case 1\n");
break;
case 23:
printf("case 2\n");
break;
case 24:
printf("case 3\n");
case 25:
printf("case 5\n");
break;
case 26:
printf("case 6\n");
break;
case 35:
printf("case 7\n");
break;
default:
printf("default \n");
break;
}
printf("HelloWorld\n");
return 0;
下标表
地址表
4.case情况 > 3种,case值最大- 最小case > 255
/*
特征是二分优化
注意:
会进行二分优化和前面三种混合优化
如二分优化加上建表的优化这几种变化的组合
*/
switch (argc)
{
case 10:
printf("case 0\n");
break;
case 200:
printf("case 1\n");
break;
case 400:
printf("case 2\n");
break;
case 800:
printf("case 3\n");
case 1000:
printf("case 5\n");
break;
case 2000:
printf("case 6\n");
break;
case 500:
printf("case 7\n");
break;
default:
printf("default \n");
break;
}
printf("HelloWorld\n");
return 0;