抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

一个循环复制的函数实现:

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 标号那里。

推荐阅读
51 秒表 51 秒表 51按键时钟 51按键时钟 Mac Code Test Mac Code Test 适用于Linux的windows子系统 适用于Linux的windows子系统 回顾几个有趣的小题目 回顾几个有趣的小题目 部署第一个智能合约 部署第一个智能合约

留言区

Are You A Robot?