Skip to content

标题: Tom Duff的C语言奇技淫巧

创建: 2021-12-30 22:00 链接: https://scz.617.cn/misc/202112302200.txt

1983年11月Tom Duff在卢卡斯影业(Lucasfilm)工作时,致力于实时动画的优化处理, 在一个特定上下文里提出一种C语言的奇技淫巧,组合利用了switch/case与do/while。

Duff's device https://en.wikipedia.org/wiki/Duff%27s_device

bluerust给我推了这个。看了一下,确实很巧妙,特定上下文里的奇技淫巧,这种写 法现在仍然得到支持。


/ * gcc-10 -Wall -pipe -O3 -s -o test test.c /

include

include

include

void duff_memcpy ( char to, char from, size_t count ) { register 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++;
             printf( "n = %d\n", n );
        } while ( --n > 0 );
}

}

int main( int argc, char *argv[] ) { char dst[0x80]; char src[0x80];

memset( ( void * )src, 'A', sizeof(src) );
memset( ( void * )dst, '\0', sizeof(dst) );
src[sizeof(src)-1]  = '\0';
puts( src );
/*
 * just copy 0x7f bytes
 */
duff_memcpy( dst, src, sizeof(src)-1 );
puts( dst );
return 0;

}

其思路是普适的,换个上下文仍有可能应用这种思路进行优化。不过我觉得,不管是 啥上下文,这种还是放到库函数里吧,正常人就别自己实现了。