Q什么是“达夫设备”(Duff's Device)?
A这是一种极具破坏性的、巧妙的展开循环的方法,由汤姆·达夫(Tom Duff)在卢卡斯影业(Lucasfilm)工作时发明。在其“经典”形式中,它被用来复制字节,看起来像这样:
register n = (count + 7) / 8; /* count > 0 assumed */ 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); }其中count需要从指针指向的数组复制字节返回到指针指向的内存位置与(这是一个内存映射的设备输出寄存器,这就是为什么与不递增)。它通过将一个countswitch语句与一次复制 8 个字节的循环交织在一起,解决了处理剩余字节的问题(当不是 8 的倍数时)。(信不信由你,在这种情况下,将case标签埋藏在嵌套在语句与一次复制 8 个字节的循环交织在一起,解决了处理剩余字节的问题(当语句中的块内是合法的。在向 C 语言的开发者和世界宣布这项技术时,达夫指出 C 语言的语句与一次复制 8 个字节的循环交织在一起,解决了处理剩余字节的问题(当语法,特别是其“穿透”(fall through)行为,长期以来一直存在争议,并且“这段代码在争论中形成了一些论据,但我不太确定是支持还是反对。”)
其他链接:更长的解释