一、简介

看到标题,大家也许知道我们要讲的内容是什么了。但是很多人可能又对这个达夫设备(Duff's Device)感到很陌生,这到底是什么东东啊?所谓的Duff's Device其实只是一种代码的特殊写法,他将switch和do...while结合起来使得算法效率变高,先上代码:

void  fDuffDevice(  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 );}  }  

可能初看,会觉得这个代码很奇怪,能否编译通过呢?亲自测试了一下,能够正常编译。

二、代码分析

我们写了一段测试代码,具体如下:

#include <stdio.h>void  fDuffDevice(  int  *  to,  int  *  from,  int  count)
{int n = (count + 7 ) / 8 ;switch (count % 8 ) {case 0 :    do {  * to ++ = * from ++ ;printf("case 0 :Running\n");case 7 :          * to ++ = * from ++ ;printf("case 7 :Running\n");case 6 :          * to ++ = * from ++ ;printf("case 6 :Running\n");case 5 :          * to ++ = * from ++ ;printf("case 5 :Running\n");case 4 :          * to ++ = * from ++ ;printf("case 4 :Running\n");case 3 :          * to ++ = * from ++ ;printf("case 3 :Running\n");case 2 :          * to ++ = * from ++ ;printf("case 2 :Running\n");case 1 :          * to ++ = * from ++ ;printf("case 1 :Running\n");} while ( -- n >    0 );}  }  int main()
{int i = 0; int to[20] = {0};int from[20] = {0};for(i = 0 ;i < 20 ;i++)from[i] = i; fDuffDevice(to,from,20);for(i = 0 ;i < 20 ;i++)printf("to[%d] = %d;\n", i ,to[i]);return 0;
}

以下是打印出来的效果:(具体的运行顺序不用我再讲了吧!)

case 4 :Running
case 3 :Running
case 2 :Running
case 1 :Running
case 0 :Running
case 7 :Running
case 6 :Running
case 5 :Running
case 4 :Running
case 3 :Running
case 2 :Running
case 1 :Running
case 0 :Running
case 7 :Running
case 6 :Running
case 5 :Running
case 4 :Running
case 3 :Running
case 2 :Running
case 1 :Running
to[0] = 0;
to[1] = 1;
to[2] = 2;
to[3] = 3;
to[4] = 4;
to[5] = 5;
to[6] = 6;
to[7] = 7;
to[8] = 8;
to[9] = 9;
to[10] = 10;
to[11] = 11;
to[12] = 12;
to[13] = 13;
to[14] = 14;
to[15] = 15;
to[16] = 16;
to[17] = 17;
to[18] = 18;
to[19] = 19;

三、意义

我们一般使用用for循环或者while循环的时候,如果执行循环内容本身用不了多少时间,本质上时间主要是消耗在了每次循环的比较语句上边。而事实上,比较语句是有很大优化空间的,我们假设你要循环10000次,结果你从第一次开始就不断的比较是否达到上界值,这是不是很徒劳呢?而达夫设备(Duff's Device)可以大大减少这种比较,我们可以看到,上面的代码,8次才进行一次比较。这样就大大节约了时间。提高了效率。

四、写在最后的话

这种写法不是很值得我们借鉴。毕竟这不是符合我们“正常”逻辑的代码,至少C/C++标准不会保证这样的代码一定不会出错。另外, 这种代码冷知识,估计有很多人根本都没见过,如果自己写的代码别人看不懂,估计会被骂的。虽然我觉得达夫设备是个很高效、很值得我们去学习的东西。把一次消耗相对比较高的操作“分摊“到了多次消耗相对比较低的操作上面,就像vector中实现可变长度的数组的思想那样,节省了大量的机器资源,也大大提高了程序的效率。

达夫设备(Duff‘s Device)相关推荐

  1. ARM Linux 3.x的设备树(Device Tree)【转】

    转自:http://blog.csdn.net/21cnbao/article/details/8457546 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] ARM Devi ...

  2. linux设备模型bus,device,driver,(kobject、ktype、kset,bus_type、device、device_driver)

    1.1Linux设备驱动模型简介 1.什么是设备驱动模型 (1)类class.总线bus(负责将设备和驱动挂接起来).设备devices.驱动driver(可以看到在驱动源码中,不管是什么样的驱动,都 ...

  3. linux设备驱动模型 - device/bus/driver

    在linux驱动模型中,为了便于管理各种设备,我们把不同设备分别挂在他们对应的总线上,设备对应的驱动程序也在总线上找,这样就提出了deivce-bus-driver的模型,硬件上有许多设备总线,那么我 ...

  4. ARM Linux 3.x的设备树(Device Tree)

    宋宝华 Barry Song <21cnbao@gmail.com> 1.    ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux ...

  5. 惠普电脑怎么用access_HP惠普笔记本设备访问管理(Device Access Manager)工具怎么样...

    20 楼 华军网友 :2017-06-27 发表 升级新版后我发现了几个小问题,并且发给HP惠普笔记本设备访问管理(Device Access Manager)工具的官方人员了,下次升级应该会解决了 ...

  6. dtb文件linux位置,dtb文件的由来与ARM Linux 3.x的设备树(Device Tree)

    1. ARM Device Tree起源 Linus Torvalds在2011年3月17日的ARM Linux邮件列表宣称"this whole ARM thing is a f*ckin ...

  7. 【USB笔记】 USB设备请求USB Device Requests

    USB笔记 USB设备请求USB Device Requests 所有USB设备都会响应主机向设备默认控制管道(Control Pipe)上发送的请求(requests). 这些请求是使用控制传输(c ...

  8. 关于android设备唯一区分device id的取得

    2019独角兽企业重金招聘Python工程师标准>>> 有些apk为了区分唯一设备,需要用到一个device id. 1. 取得设备的MAC address    如果用户没有通过w ...

  9. 设备树(device tree)学习笔记

    1.反编译设备树 在设备树学习的时候,如果可以看到最终生成的设备树的内容,对于我们学习设备树以及分析问题有很大帮助.这里我们需要使用设备树生成工具dtc的反编译功能 root@pengdl-Virtu ...

最新文章

  1. PHP开发绝对不能违背的安全铁则!
  2. 线性汇编总结和函数说明
  3. 牛客挑战赛43C-最优公式【二分】
  4. 【树链剖分】Disruption P(luogu 4374)
  5. SpringCloud 配置服务器
  6. resourcehacker
  7. 通信中的“交织”技术
  8. 计算机键盘驱动,修改键盘驱动程序_基本计算机知识_IT /计算机_信息
  9. 华为----园区网络三层架构实验
  10. sumifs两个求和列如何计算_「sumifs」多条件求和函数Sumifs的用法 - seo实验室
  11. win10配置系统默认utf-8编码
  12. 生物信息之独孤九剑——sort
  13. Excel 常用快捷键
  14. 北航2021编译原理实验样例编译器-PCODE实现总结
  15. 河北师范大学matlab,赵欣老师简介
  16. JAVA-读取excel转成html 将excel表格转换为HTML文件格式 转成前端表格样式
  17. 藏不住了,乐视带着新品手机归来!
  18. Python的IDEL增加清屏功能
  19. imp-00003: 遇到 oracle 错误 4052,imp IMP-00041错误处理
  20. lisp填挖横断面提取_求助,AUTOLISP语言的这个程序流程图怎么写。关于纵横断面绘制的...

热门文章

  1. JavaWeb学习之Path总结、ServletContext、ServletResponse、ServletRequest(3)
  2. 费马小定理与素数判定
  3. 使用DOS命令找到占用80端口的程序,关闭该程序
  4. DeepLearning索引
  5. UA MATH636 信息论7 并行高斯信道简介
  6. 利用emu8086学习汇编int 10h功能
  7. 并发编程之Synchronized原理
  8. python爬虫必会的23个项目
  9. Centos 6.5 python 2.6.6 升级到 2.7
  10. Spring源码解析-核心类之XmlBeanDefinitionReader