关于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]
,接收输入的参数为 num1
、 num2
,而后数组根据数组索引,选择相应的数组元素(也就是对应的功能函数),执行,返回。
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。