一个循环复制的函数实现:
void NormalCopy(char *to,char* from,int count) { do { *to = *from++; } while (--count>0); }
|
用 Duff’s device 方法改写后的代码:
void DuffDev(char *to, char *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); } }
|
时间要回到 1983 年,那是一个雨过天晴的夏天,在卢卡斯影业上班的程序员 Tom Duff,他是想为了加速一个实时动画程序,实现从一个数组复制数据到一个寄存器这样一个功能
但是达夫洞察到,若在这一过程中将一条 switch 和一个循环相结合,则可展开循环,应用的是 C 语言里面 case
标签的 Fall through
特性,实际就是没有 break 继续执行。
#include <iostream>
using namespace std;
int main() { int n = 3; switch (n) { case 0: do { cout << " 0 " << endl; case 1: cout << " 1 " << endl; case 2: cout << " 2 " << endl; case 3: cout << " 3 " << endl; } while (--n > 0); } }
|
这段代码的主体还是 do-while 循环,但这个循环的入口点并不一定是在 do 那里,而是 switch(n)
,把循环的入口定在了几个 case 标号那里。