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

    在 Python 的生态系统中,wheel 是一种打包格式,用于分发和安装 Python 项目.它是 Python 包的标准格式之一,旨在提高安装速度和可靠性. Wheel 的优势 快速安装:因为 w ...

  2. BibTeX 和 BibLaTeX

    BibTeX:传统的参考文献处理工具,使用 .bst 文件来定义参考文献的样式. BibLaTeX:功能更强大且更现代的工具,使用 .bbx..cbx 和 .dbx 文件来定义参考文献和引用的样式. ...

  3. 【Mac + Appium + Java1.8(一)】之Android自动化环境安装配置以及IDEA配置(附录扩展Selenium+Java自动化)

    配置环境: MacOS:10.13.6 java:1.8 IntelliJ IDEA:2018.3 Android SDK:25 Appium:1.9.1 Appium-desktop:1.7.1 j ...

  4. Instant exceeds minimum or maximum instant

    使用 Instant.now().plusSeconds("xxxxx")报错  Instant exceeds minimum or maximum instant原因是取值范围 ...

  5. Java基础12

    抽象类与抽象方法 abstract : 抽象的 abstract可以用来修饰:类.方法 abstract修饰类 > 此类称为抽象类 > 抽象类不能实例化 > 抽象类中是包含构造器的, ...

  6. Entity Framework Plus: 让 EF Core 开发如虎添翼

    EF Core介绍 Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台版的常用 Entity Framework 数据访问技术,EF Core 是适用于 .NET 的 ...

  7. async/await和Grand Central Dispatch代码切换

    很多iOS开发开始学习结构化并发时已经用过了很多年Grand Central Dispatch,虽然从思想上二者区别很大,但是利用熟悉的东西去理解新的事物有助于提升学习理解的效率,接下来是这Grand ...

  8. kali系统安装和CVE-2017-12615测试

    1 安装kali系统 1.1 下载VMware压缩包 kali-linux-2022.1 默认的用户和密码是kali 1.2 初始化系统 sudo apt update -y #kali sudo a ...

  9. UEFI原理与编程(二)

    系统表 对UEFI应用程序和驱动程序开发人员来讲,系统表是最重要的数据结构之一,它是用户空间通往内核空间的通道.有了它,UEFI应用程序和驱动才可以访问UEFI内核.硬件资源和I/O设备. 1 在应用 ...

  10. usb请求块以及提交方式

    URB结构体 struct urb { /* private: usb core and host controller only fields in the urb */ struct kref k ...