标题: 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;
}
其思路是普适的,换个上下文仍有可能应用这种思路进行优化。不过我觉得,不管是 啥上下文,这种还是放到库函数里吧,正常人就别自己实现了。