关于switch的优化:转移表(完结)

用转移表来代替功能实现中的 switch 语句

1. switch 语句应用场景

在许多场景中会用到条件判断,此时简单的条件判断一般通过 if/else 语句实现;如果涉及三条以上的功能分支一般会通过 switch 语句实现。

但是在最近的项目应用中,比如说在从机与主机通信处理中会涉及十几条功能分支,用 switch 语句实现的缺点我觉得:一个是结构冗余,毕竟看着一行 switch 开始,后面跟着几十行代码(PS:像一堆shishan);另一个是看着那些代码第一感觉就是代码执行效率不高。

2. 以函数指针为元素的数组

今天看到一个C的转移表相关的内容,关于转移表的实现首先引入一个以函数指针为元素的数组。

  int  (*f[])();

这里有两对括号,分别表示不同的意义。
括号内的表达式 *f[] 首先求值,所以 f 是一个元素为某种类型的指针的数组。
表达式末尾的 () 是函数调用操作符。
所以 f 是一个数组,数组元素的类型为函数指针。

3. 转移表实现

有了以函数指针为元素的数组的背景,就开始分析转移表的实现。实现列出需要转化为转移表的 switch 语句,如下:

  switch( RXBUF[2] )
  {
    case ADD:
        result = add( num1, num2 );
        break;
    case SUB:
        result = sub( num1, num2 );
        break;
    case MUL:
        result = mul( num1, num2 );
        break;
    ...
  }

以上代码实现的功能就是通过判断 RXBUF[2] 的值,选择分支去执行后续功能。
那么思路就是,先实现各个分支功能的函数,如 int add( num1, num2 ); 。接下来,我们需要实现一个以函数指针为元素的数组,数组索引就是 RXBUF[2] ,接收输入的参数为 num1num2 ,而后数组根据数组索引,选择相应的数组元素(也就是对应的功能函数),执行,返回。

  int add( num1, num2 );
  int sub( num1, num2 );
  int mul( num1, num2 );
  ...
  int (*oper_fun[])( num1, num2 ) = {
    add, sub, mul...
  }

调用方法如下:

  result = oper_fun[ RXBUF[2] ]( num1, num2 );

这样,就用一条简洁干练的代码代替了一堆shishan。

posted @ 2024-03-31 22:20  likkoliu  阅读(32)  评论(0编辑  收藏  举报