Tom Duff的C语言奇技淫巧
2022-1-5 03:15:0 Author: mp.weixin.qq.com(查看原文) 阅读量:20 收藏

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 <stdio.h>
#include <string.h>
#include <unistd.h>

void duff_memcpy char *to, char *from, size_t count )
{
    register int n = ( count + 7 ) / 8;

    switch ( count % 8 )
    {
    case 0do { *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 mainint 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;
}

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


文章来源: http://mp.weixin.qq.com/s?__biz=MzUzMjQyMDE3Ng==&mid=2247485164&idx=1&sn=94e64b099e7f52fdfd7de13c63514d2a&chksm=fab2c5d3cdc54cc5f5ed556340d095ec46ea69bc5b9f1f3f840e95f9eab92ad9f70bf047a5a5#rd
如有侵权请联系:admin#unsafe.sh