关于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。
关于switch的优化:转移表(完结)的更多相关文章
- C 函数指针 函数指针数组 转移表
内容来自<c和指针>,整理后方便个人理解 高级声明 cdel程序可以方便的给出声明的释义 指向函数的指针 int ( *f ) ( int n_values, float amount ) ...
- 优化SQLServer——表和分区索引
概念: 简单地说,分区是将大型的对象(如表)分成更小的且易于管理的小块.分区的基本单位是行,需要注意的是与分区视图不同的地方时,分区必须位于同一个数据库内. 分区的原因: 对于非 ...
- wordpress数据库优化wp_posts表 OPTIMIZE
wordpress数据库优化wp_posts表 对 MySQL 数据记录进行插入.更新或删除时,会占有不同大小的空间,记录就会变成碎片,且留下空闲的空间.就像具有碎片的磁盘,会降低性能,需要整理,因此 ...
- SQL Server查询性能优化——堆表、碎片与索引(二)
本文是对 SQL Server查询性能优化——堆表.碎片与索引(一)的一些总结. 第一:先对 SQL Server查询性能优化——堆表.碎片与索引(一)中的例一的SET STATISTICS IO之 ...
- Hive优化-大表join大表优化
Hive优化-大表join大表优化 5.大表join大表优化 如果Hive优化实战2中mapjoin中小表dim_seller很大呢?比如超过了1GB大小?这种就是大表join大表的问题.首先引入一个 ...
- C/C++用状态转移表联合函数指针数组实现状态机FSM
状态机在project中使用很的频繁,有例如以下常见的三种实现方法: 1. switch-case 实现.适合简单的状态机. 2. 二维状态表state-event实现.逻辑清晰.可是矩阵通常比較稀疏 ...
- 'ALTER TABLE SWITCH' 语句失败。表'MGXXX.dbo.user_XXX' 已分区,但 索引'ix_user_XXX_user_id' 未分区。
问题描述: 今天在做分区切换的时候把旧log数据切到clear表,遇到了这个问题,顺便做下笔记记录一下解决方法 'ALTER TABLE SWITCH' 语句失败.表'MGXXX.dbo.user_X ...
- 0709MySQL 数据库性能优化之表结构优化
转自http://isky000.com/database/mysql-perfornamce-tuning-schema MySQL 数据库性能优化之缓存参数优化 MySQL数据库性能优化之硬件瓶颈 ...
- MySQL数据库性能优化:表、索引、SQL等
一.MySQL 数据库性能优化之SQL优化 注:这篇文章是以 MySQL 为背景,很多内容同时适用于其他关系型数据库,需要有一些索引知识为基础 优化目标 减少 IO 次数IO永远是数据库最容易瓶颈的地 ...
- Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇)
Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 目录 Mysql优化(出自官方文档) - 第十篇(优化InnoDB表篇) 1 Optimizing Storage Layout f ...
随机推荐
- Python wheel
在 Python 的生态系统中,wheel 是一种打包格式,用于分发和安装 Python 项目.它是 Python 包的标准格式之一,旨在提高安装速度和可靠性. Wheel 的优势 快速安装:因为 w ...
- BibTeX 和 BibLaTeX
BibTeX:传统的参考文献处理工具,使用 .bst 文件来定义参考文献的样式. BibLaTeX:功能更强大且更现代的工具,使用 .bbx..cbx 和 .dbx 文件来定义参考文献和引用的样式. ...
- 【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 ...
- Instant exceeds minimum or maximum instant
使用 Instant.now().plusSeconds("xxxxx")报错 Instant exceeds minimum or maximum instant原因是取值范围 ...
- Java基础12
抽象类与抽象方法 abstract : 抽象的 abstract可以用来修饰:类.方法 abstract修饰类 > 此类称为抽象类 > 抽象类不能实例化 > 抽象类中是包含构造器的, ...
- Entity Framework Plus: 让 EF Core 开发如虎添翼
EF Core介绍 Entity Framework (EF) Core 是轻量化.可扩展.开源和跨平台版的常用 Entity Framework 数据访问技术,EF Core 是适用于 .NET 的 ...
- async/await和Grand Central Dispatch代码切换
很多iOS开发开始学习结构化并发时已经用过了很多年Grand Central Dispatch,虽然从思想上二者区别很大,但是利用熟悉的东西去理解新的事物有助于提升学习理解的效率,接下来是这Grand ...
- kali系统安装和CVE-2017-12615测试
1 安装kali系统 1.1 下载VMware压缩包 kali-linux-2022.1 默认的用户和密码是kali 1.2 初始化系统 sudo apt update -y #kali sudo a ...
- UEFI原理与编程(二)
系统表 对UEFI应用程序和驱动程序开发人员来讲,系统表是最重要的数据结构之一,它是用户空间通往内核空间的通道.有了它,UEFI应用程序和驱动才可以访问UEFI内核.硬件资源和I/O设备. 1 在应用 ...
- usb请求块以及提交方式
URB结构体 struct urb { /* private: usb core and host controller only fields in the urb */ struct kref k ...