switch case优化方案一:连续或较为连续
switch case的应用
#include <stdlib.h>
int main(int argc, char* argv[])
{
int a = 3;
switch(a)
{
case 0:
printf("a == 0");
break;
case 1:
printf("a == 1");
break;
case 2:
printf("a == 2");
break;
case 3:
printf("a == 3");
break;
case 4:
printf("a == 4");
break;
case 5:
printf("a == 5");
break;
default:
printf("default");
}
system("pause");
return 0;
}
switch case的性质
1.所有分支的效率均等,不区分优先级;
2.无论怎么调整case的位置,对运行效率均无影响;
原理
switch(a),a的值为几,就取出case几的地址,运行地址中的代码
如果a的值为2,则运行case 2中的代码,如果case 2中没有break;函数,则会接着运行case 2下面的地址中的代码
即使case的顺序是乱的,switch依然可以正常寻找到对应条件的case地址运行其中的代码
ps:值得注意的是,如果case是乱序,default也随意插在某两个case之间,当所有case都不满足switch的条件时,则会从default处开始往下执行,此时在default之后的case中的代码也会被顺着往下执行。
在内存中观察switch函数的优化过程
此时,switch(a),a的值为3,在汇编代码中可以看出,switch函数所在的地址,地址为0041253C
接下来转到0041253C这个地址中,看看这个地址中存放了什么
可以清楚的看到switch函数所在地址中,存放着每个case的地址,case 0的地址为004124B5 ,case 1 的地址为004124C4等等,以此类推,是按照case0 case1 case2....的顺序排列。(地址是以小尾方式存储的,所以要反过来读)
此时我们将代码中的case0 case1 case 2...的顺序给打乱,再观察内存中会发生什么变化
可以看出,在内存中的存放顺序并没有发生改变,依然从case 0开始存放
所以说,switch(a)可以根据a的值直接找到对应的case。
当case不以连续的方式(较为连续)排列时,内存中如何变化?
可以看出,case依然从0开始往后排列,case0和case2之前缺少case1,所以由default的004124E2填充,起到一个过渡的作用
版权属于:KrisWi
本文链接:https://blog.aqkx.com/index.php/archives/74/
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。
2 条评论
hihihi
test