用转移表来代替功能实现中的 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。

关于switch的优化:转移表(完结)的更多相关文章

  1. C 函数指针 函数指针数组 转移表

    内容来自<c和指针>,整理后方便个人理解 高级声明 cdel程序可以方便的给出声明的释义 指向函数的指针 int ( *f ) ( int n_values, float amount ) ...

  2. 优化SQLServer——表和分区索引

    概念: 简单地说,分区是将大型的对象(如表)分成更小的且易于管理的小块.分区的基本单位是行,需要注意的是与分区视图不同的地方时,分区必须位于同一个数据库内. 分区的原因:            对于非 ...

  3. wordpress数据库优化wp_posts表 OPTIMIZE

    wordpress数据库优化wp_posts表 对 MySQL 数据记录进行插入.更新或删除时,会占有不同大小的空间,记录就会变成碎片,且留下空闲的空间.就像具有碎片的磁盘,会降低性能,需要整理,因此 ...

  4. SQL Server查询性能优化——堆表、碎片与索引(二)

    本文是对 SQL Server查询性能优化——堆表.碎片与索引(一)的一些总结.  第一:先对 SQL Server查询性能优化——堆表.碎片与索引(一)中的例一的SET STATISTICS IO之 ...

  5. Hive优化-大表join大表优化

    Hive优化-大表join大表优化 5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个 ...

  6. C/C++用状态转移表联合函数指针数组实现状态机FSM

    状态机在project中使用很的频繁,有例如以下常见的三种实现方法: 1. switch-case 实现.适合简单的状态机. 2. 二维状态表state-event实现.逻辑清晰.可是矩阵通常比較稀疏 ...

  7. 'ALTER TABLE SWITCH' 语句失败。表'MGXXX.dbo.user_XXX' 已分区,但 索引'ix_user_XXX_user_id' 未分区。

    问题描述: 今天在做分区切换的时候把旧log数据切到clear表,遇到了这个问题,顺便做下笔记记录一下解决方法 'ALTER TABLE SWITCH' 语句失败.表'MGXXX.dbo.user_X ...

  8. 0709MySQL 数据库性能优化之表结构优化

    转自http://isky000.com/database/mysql-perfornamce-tuning-schema MySQL 数据库性能优化之缓存参数优化 MySQL数据库性能优化之硬件瓶颈 ...

  9. MySQL数据库性能优化:表、索引、SQL等

    一.MySQL 数据库性能优化之SQL优化 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础 优化目标 减少 IO 次数IO永远是数据库最容易瓶颈的地 ...

  10. Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇)

    Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 目录 Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 1 Optimizing Storage Layout f ...

随机推荐

  1. Prism:框架介绍与安装

    Prism:框架介绍与安装 什么是Prism? Prism是一个用于在 WPF.Xamarin Form.Uno 平台和 WinUI 中构建松散耦合.可维护和可测试的 XAML 应用程序框架 Gith ...

  2. c++学习笔记(四):面向对象

    目录 类 & 对象 封装 访问权限 类的构造函数&析构函数 构造函数的分类及调用 拷贝构造函数的调用时机 构造函数调用规则 深拷贝与浅拷贝 初始化列表 类对象作为类成员 静态成员 C+ ...

  3. 【YashanDB知识库】数据变化率超过阈值统计信息失效

    [问题分类]性能优化 [关键字]统计信息 [问题描述] SQL --创建表结构 drop table t1; create table t1 (id int,name varchar2(200)); ...

  4. 【题目全解】ACGO排位赛#12

    ACGO 排位赛#12 - 题目解析 别问为什么没有挑战赛#11,因为挑战赛#11被贪心的 Yuilice 吃掉了(不是). 本次挑战赛难度相比较前面几次有所提升. 爆料:小鱼现在已经入职了研发部门, ...

  5. Visual Studio & VS Code

    前言 会写这篇是因为想记入一个 bug. 随便以后记入一些 Visual Studio 和 VS Code 相关的冬冬呗. 当 VS Code Hot Reload 遇上 View Component ...

  6. Spring —— 注解开发(bean管理)

    注解定义bean       纯注解开发(无需配置文件)       bean作用范围    bean生命周期   

  7. Windows安装Powershell7.x

    事件起因: 由于需要运行一个脚本,但是该脚本是广大网友群众使用Powershell7写的,我自带的是Powershell5,运行过程中总是出现莫名其妙的问题,于是决定将Powershell升级到Pow ...

  8. 墨天轮PostgreSQL精品学习资源合集(含基础手册、实操技巧&案例、书籍推荐)

    近日,PostgreSQL 15 的第一个 beta 版本发布,这一最新版本在开发者体验.性能表现等方面都有提升.从最新的DB-Engines排名可以发现,PostgreSQL近十年来得分一路高涨,目 ...

  9. 树形结构数据 数组对象 按照 sort 字段排序

    export function sortTreeData (data, flag) { let arr = [] if (flag === 1) { arr = data[0].children } ...

  10. 通过maven动态配置spring boot配置文件

    一.引入maven插件的jar包 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifact ...