用转移表来代替功能实现中的 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. uniCloud 云开发Dome

    实现账号密码登录,注册, 信息图片上传与查看 项目地址:https://gitee.com/jielov/uni-cloud_development 先创建云服务空间 与云函数 可参考 https:/ ...

  2. pyinstaller 打包成 exe

    生成 spec 和可执行文件: pyinstaller --onefile your_file.py 如果需要修改生成的spec文件,则后续可以这样运行: pyinstaller -F your_fi ...

  3. P3792 由乃与大母神原型和偶像崇拜

    题意 给定长为 \(n\) 的数组 \(a\),支持单点修改,\(q\) 次查询区间 \([l,r]\) 是否可以重排为值域上连续的一段. \(n,q\le5\times10^5,a_i\le2.5\ ...

  4. 合合信息通过ISO/IEC国际标准双认证,为全球用户提供高合规标准AI服务

    互联网.AI等技术的全球普及为人们提供便捷服务的同时,也带来了信息安全领域的诸多挑战.保护用户隐私及数据安全,是科技企业规范.健康发展的重心.近期,上海合合信息科技股份有限公司(简称"合合信 ...

  5. DECL: 针对噪声时间序列的去噪感知对比学习《Denoising-Aware Contrastive Learning for Noisy Time Series》(时间序列、对比学习、去噪)

    今天是2024年9月12日,组会摸鱼,很久没看论文了,在摸鱼看代码,最近IJCAI 2024出来了,找了几篇论文看,首先这是第一篇. 论文:Denoising-Aware Contrastive Le ...

  6. Go日志管理库zap

    一.zap介绍 在许多Go语言项目中,我们需要一个好的日志记录器能够提供下面这些功能: 1.能够将事件记录到文件中,而不是应用程序控制台. 2.日志切割-能够根据文件大小.时间或间隔等来切割日志文件. ...

  7. ASP.NET Core – Dependency Injection

    前言 很久很久以前就写过了 Asp.net core 学习笔记 ( DI 依赖注入 ), 这篇只是整理一下而已. 参考 Using dependency injection in a .Net Cor ...

  8. Session——基本使用

    Session    Session 原理 Session 使用细节      

  9. Servlet——Response对象

    Response对象         Response 设置响应数据   1.响应行          void setStatus(int sc):设置响应状态码   2.响应头           ...

  10. 【赵渝强老师】使用Docker Compose进行服务编排

    一.什么是Docker Compose? Docker Compose是一个用来定义和运行复杂应用的Docker工具.一个使用Docker容器的应用,通常由多个容器组成.使用Docker Compos ...