前言

本文主要介绍的是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别致源码相关推荐

  1. react相关代码库以及框架的源码解析

    持续更新中react相关库源码浅析, react ts3 项目 ???对react相关代码库以及框架的源码进行了一定的分析 ?react16.6 View contents 源码实例分析:可见runl ...

  2. ViewGroup的Touch事件分发(源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,View的touch事件分发相对比较简单,可参考 View的Touch事件分发(一.初步了解) View的Touch事 ...

  3. View的Touch事件分发(二.源码分析)

    Android中Touch事件的分发又分为View和ViewGroup的事件分发,先来看简单的View的touch事件分发. 主要分析View的dispatchTouchEvent()方法和onTou ...

  4. 源码分析-Activity的启动流程

    以android 6.0源码为参考,其他版本api会稍有不同 在Activity中,启动一个Activity的方法 @Override public void startActivity(Intent ...

  5. MyBatis原理分析之四:一次SQL查询的源码分析

    上回我们讲到Mybatis加载相关的配置文件进行初始化,这回我们讲一下一次SQL查询怎么进行的. 准备工作 Mybatis完成一次SQL查询需要使用的代码如下: Java代码   String res ...

  6. 一步一步Asp.Net MVC系列_权限管理总结(附MVC权限管理系统源码)

    TZHSWEET:请大家多多反馈问题,我已经在修改中了,已更新版本...... 如果大家遇到数据库附加问题,EF连接字符串问题,请自行配置,如果有bug反馈可以私聊,我的qq:409180955. 项 ...

  7. android源代码 abi,Android内核源码Abi目录学习笔记

    好记性不如烂笔头,今天要学习的是Android中Abi目录下的代码.下面是基本的学习的笔记的汇总. 首先是include中的头文件的说明. 在cxxabi的头文件中主要需要掌握下面的几个点: 1.这个 ...

  8. linux下free源码,linux命令free源码解读:Procps free.c

    linux命令free源码解读 linux命令free源码解读:Procps free.c 作者:isayme 发布时间:September 26, 2011 分类:Linux 我们讨论的是linux ...

  9. Thrift源码解析--TBinaryProtocol

    本文为原创:http://www.cnblogs.com/leehfly/p/4958206.html,未经许可禁止转载. 关于Tprotocol层都是一些通信协议,个人感觉内容较大,很难分类描述清楚 ...

最新文章

  1. 别学前端了!前端程序员:凭啥??网友:来钱太快你会飘!
  2. delphi 属性编辑器
  3. java-集合排序,队列,散列表map以及如何遍历
  4. 如何选择正确的激活函数?
  5. Android的几种常用工具简称
  6. Kubernetes的控制器类型即使用案例
  7. Java的for-each循环
  8. 时间序列异常检测 EGADS Surus iForest
  9. Apache 中 .htaccess 文件设置技巧16则
  10. IOT---(6)Android Things 开发环境搭建
  11. Merge into的使用详解-你Merge了没有【转】
  12. warning C4996 错误
  13. keras从dataframe中读取数据并进行数据增强进行训练(分类+分割)
  14. 第一行代码--笔记(3)
  15. 防止 7-Zip 生成的 ZIP 文件在 Mac OS X 下出现乱码
  16. 摄像头如何被他人控制
  17. android最低版本+黑域,免root版黑域
  18. 2015Esri全球用户大会top10的QA
  19. 掌上生活显示服务器忙,掌上生活服务端
  20. python 爬虫 微博 github_GitHub - bubblesran/weiboSpider: 新浪微博爬虫,用python爬取新浪微博数据...

热门文章

  1. 如何用计算机控制电灯,教你用智能手机遥控电灯
  2. 矩阵实验室matlab下载,matlab matlab(矩阵实验室) v6.5.0迷你版
  3. Abp 项目中接入开源日志面板LogDashboard (1)
  4. 决策树(二):回归树和模型树
  5. js中的数组方法以及循环数组的方法
  6. java 身份证号码正则表达式校验
  7. libiconv移植到android
  8. 手机端网页实现预览PPT word Excel
  9. 西南大学计算机组成原理实验,计算机组成原理
  10. 到底是学历重要还是能力重要