switch别致源码
前言
本文主要介绍的是C语言中switch的别样玩法,这是很多学习C语言的人基本都没有见过的一个冷知识,虽然不是很常用,但是希望对于广大读者学习C语言有一些帮助。
switch别致源码展示
如果你是第一次看到的话,不妨试一下,看你能得出该写法的作用吗?相信大家写业务逻辑的时候,都是面向if、else、for、while、switch编程。但是你见过switch嵌套do..while吗?
咋的一看,这啥鬼玩意啊,switch/while这组合能编译通过吗?您可别怀疑,还真能。这个就是达夫设备(Duff's Device),不信的同学可以拿以下代码去测试一下:
#include <stdio.h>
#include <graphics.h>
#include <conio.h>
#include <time.h>
void send(int* to, int* from, int count)
{int n = (count + 7) / 8;switch (count % 8) {case 0: do {*to++ = *from++;case 7: *to++ = *from++;case 6: *to++ = *from++;case 5: *to++ = *from++;case 4: *to++ = *from++;case 3: *to++ = *from++;case 2: *to++ = *from++;case 1: *to++ = *from++;} while (--n > 0);}
}
void print(int array[], int count)
{for (int i = 0; i < count; i++) {printf("%d\t", array[i]);}printf("\n");
}
int main()
{int to[8] = {0};int from[8] = { 1,2,3,4,5,6,7,8};int count = 8;send(to, from, count);print(to,8);return 0;
}
达夫设备(Duff's Device)
百度百科的说法:
在计算机科学领域,达夫设备(英文:Duff‘s device)是串行复制(serial copy)的一种优化实现,通过汇编语言编程时一常用方法,实现展开循环,进而提高执行效率。这一方法据信为当时供职于卢卡斯影业的汤姆·达夫于1983年11月发明,并可能是迄今为止利用C语言switch语句特性所作的最巧妙的实现。
简单的来说:达夫设备是一个加速循环语句的C编码技巧。 其基本思想是减少循环测试的执行次数。
Tom Duff
在卢卡斯影业上班的程序员 Tom Duff,他是想为了加速一个实时动画程序,实现从一个数组复制数据到一个寄存器这样一个功能,一般情况下,若要将数组元素复制进存储器映射输出寄存器,很多人都会想到使用如下写法:
do {*to = *from++;
} while(--count > 0);
我们一般使用用for循环或者while循环的时候,如果执行循环内容本身用不了多少时间,本质上时间主要是消耗在了每次循环的比较语句上边。而事实上,比较语句是有很大优化空间的,我们假设你要循环10000次,结果你从第一次开始就不断的比较是否达到上界值,这是不是很徒劳呢?我们写一个达夫设备的函数就不会有这样的情况(不同测试会有不同效果,大家可以自行测试一下)
尾言
达夫设备确实缩短了不少时间,值得一提的是,针对串行复制的需求,标准C语言库提供了memcpy函数,而其效率不会比斯特劳斯鲁普版的达夫设备低,并可能包含了针对特定架构的优化,从而进一步大幅提升执行效率。所以呢,这个东西你知道了解即可。文章都是手打原创,每天最浅显的介绍C语言、C++,windows知识,喜欢我的文章就关注一波吧,每天带你学习C/C++不同的知识,也可以看到最新更新和之前发表的文章哦。如果足下基础比较差,不妨关注下人人都可以学习的公众号教程
switch别致源码相关推荐
- react相关代码库以及框架的源码解析
持续更新中react相关库源码浅析, react ts3 项目 ???对react相关代码库以及框架的源码进行了一定的分析 ?react16.6 View contents 源码实例分析:可见runl ...
- ViewGroup的Touch事件分发(源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...
- View的Touch事件分发(二.源码分析)
Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...
- 源码分析-Activity的启动流程
以android 6.0源码为参考,其他版本api会稍有不同 在Activity中,启动一个Activity的方法 @Override public void startActivity(Intent ...
- MyBatis原理分析之四:一次SQL查询的源码分析
上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码 String res ...
- 一步一步Asp.Net MVC系列_权限管理总结(附MVC权限管理系统源码)
TZHSWEET:请大家多多反馈问题,我已经在修改中了,已更新版本...... 如果大家遇到数据库附加问题,EF连接字符串问题,请自行配置,如果有bug反馈可以私聊,我的qq:409180955. 项 ...
- android源代码 abi,Android内核源码Abi目录学习笔记
好记性不如烂笔头,今天要学习的是Android中Abi目录下的代码.下面是基本的学习的笔记的汇总. 首先是include中的头文件的说明. 在cxxabi的头文件中主要需要掌握下面的几个点: 1.这个 ...
- linux下free源码,linux命令free源码解读:Procps free.c
linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...
- Thrift源码解析--TBinaryProtocol
本文为原创:http://www.cnblogs.com/leehfly/p/4958206.html,未经许可禁止转载. 关于Tprotocol层都是一些通信协议,个人感觉内容较大,很难分类描述清楚 ...
最新文章
- 别学前端了!前端程序员:凭啥??网友:来钱太快你会飘!
- delphi 属性编辑器
- java-集合排序,队列,散列表map以及如何遍历
- 如何选择正确的激活函数?
- Android的几种常用工具简称
- Kubernetes的控制器类型即使用案例
- Java的for-each循环
- 时间序列异常检测 EGADS Surus iForest
- Apache 中 .htaccess 文件设置技巧16则
- IOT---(6)Android Things 开发环境搭建
- Merge into的使用详解-你Merge了没有【转】
- warning C4996 错误
- keras从dataframe中读取数据并进行数据增强进行训练(分类+分割)
- 第一行代码--笔记(3)
- 防止 7-Zip 生成的 ZIP 文件在 Mac OS X 下出现乱码
- 摄像头如何被他人控制
- android最低版本+黑域,免root版黑域
- 2015Esri全球用户大会top10的QA
- 掌上生活显示服务器忙,掌上生活服务端
- python 爬虫 微博 github_GitHub - bubblesran/weiboSpider: 新浪微博爬虫,用python爬取新浪微博数据...