MHuiG

「看庭前花开花落,望天上云卷云舒」

# Duff's Device

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

    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按键时钟 Mac Code Test 部署第一个智能合约 适用于Linux的windows子系统 回顾几个有趣的小题目

留言区

<pjax>
</pjax>
<pjax></pjax>
<pjax> Are You A Robot?</pjax>