prev up next   top/contents search

comp.lang.c FAQ 列表· 问题 20.35

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)行为,长期以来一直存在争议,并且“这段代码在争论中形成了一些论据,但我不太确定是支持还是反对。”)

其他链接:更长的解释


prev up next   contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管