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的位置,对运行效率均无影响;

原理
swcylt.png

switch(a),a的值为几,就取出case几的地址,运行地址中的代码

如果a的值为2,则运行case 2中的代码,如果case 2中没有break;函数,则会接着运行case 2下面的地址中的代码

lc2.png

即使case的顺序是乱的,switch依然可以正常寻找到对应条件的case地址运行其中的代码

ps:值得注意的是,如果case是乱序,default也随意插在某两个case之间,当所有case都不满足switch的条件时,则会从default处开始往下执行,此时在default之后的case中的代码也会被顺着往下执行。

在内存中观察switch函数的优化过程
hbdm.png

此时,switch(a),a的值为3,在汇编代码中可以看出,switch函数所在的地址,地址为0041253C

接下来转到0041253C这个地址中,看看这个地址中存放了什么
qtdz.png
可以清楚的看到switch函数所在地址中,存放着每个case的地址,case 0的地址为004124B5 ,case 1 的地址为004124C4等等,以此类推,是按照case0 case1 case2....的顺序排列。(地址是以小尾方式存储的,所以要反过来读)

此时我们将代码中的case0 case1 case 2...的顺序给打乱,再观察内存中会发生什么变化
tzsx.png

sxyy.png

可以看出,在内存中的存放顺序并没有发生改变,依然从case 0开始存放

所以说,switch(a)可以根据a的值直接找到对应的case。

当case不以连续的方式(较为连续)排列时,内存中如何变化?
jwlx.png
dftc.png
gcdf.png
可以看出,case依然从0开始往后排列,case0和case2之前缺少case1,所以由default的004124E2填充,起到一个过渡的作用

最后修改:2023 年 10 月 13 日
如果觉得我的文章对你有用,请随意赞赏