纽约时报长篇报道:《普京的战争》

一边是狂欢和庆祝,一边是哭泣和寿衣!

母子乱伦:和儿子做了,我该怎么办?

中国大陆本轮感染高峰死亡人数的估算

2021年推特网黄Top10排行榜

生成图片,分享到微信朋友圈

自由微信安卓APP发布,立即下载! | 提交文章网址
查看原文

Tom Duff的C语言奇技淫巧

Tom Duff 青衣十三楼飞花堂 2022-01-05

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 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;
}


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

: . Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

文章有问题?点此查看未经处理的缓存