关于memcpy函数探讨

//这是微软公开的crt src文件夹内的源代码:

void * memcpy_1 (void * dst, void * src , size_t n)

{

    void * ret = dst;

    while (n--) {

            *(char *)dst = *(char *)src;

            dst = (char *)dst + 1;

            src = (char *)src + 1;

    }

    return ret;

}

//这是我写的,按照最近流行的优化方式做的

void * memcpy_2 (void * dst, void * src , size_t n)

{

    void * ret = dst;

    size_t l = n>>2;

    while (l--) {

        *(size_t *)dst = *(size_t *)src;

        dst = (size_t *)dst + 1;

        src = (size_t *)src + 1;

    }

    l = n & 3;

    while (l--) {

        *(char *)dst = *(char *)src;

        dst = (char *)dst + 1;

        src = (char *)src + 1;

    }

    return ret;

}

void main(int argc, char ** argv)

{

    const int cstMemSize = 0x2FFFFFF;

    if(argc<2)

    {

        printf("请输入参数 [ 0 | 1 | 2 | 3] ");

        return ;

    }

    char * str  = (char*)malloc(cstMemSize);

    char * str2 = (char*)malloc(cstMemSize+16);

    size_t t1 = get_time_ms();

    switch(argv[1][0])

    {

        case '0': memcpy(str, str2, cstMemSize );

            break;

        case '1': memcpy_1(str, str2, cstMemSize );

            break;

        case '2': memcpy_2(str, str2, cstMemSize );

            break;

        case '3': memcpy_2(str, str2+1, cstMemSize );  //考虑字节不对齐的情况

            break;

    }

   

   

    double t2 = get_time_ms();

    free(str);

    free(str2);

    printf("memset_%c %f\n", argv[1][0] ,t2-t1);

}

在windows xp/vc6环境下:

结果发现memcpy_1是最慢的,当然,这是串操作,当然很慢;

但是直接调用memcpy函数是最快的,这大概是微软在vc链接程序时做的优化.

而上面memcpy_2的效果一般般,比memcpy_1快,但是不如直接调用memcpy快.

在gcc/freebsd环境下,如果未加优化参数-O2,case '3'的情况速度更慢.我怀疑可能是字节不对齐带来的恶果.

不过,当开启了-O2后,4个case的测试时间差不多了.但是还是gcc自己的memset函数最快.

我现在怀疑,象(int *)这样的奇技淫巧如果使用不当,带来的效果不明显,还不如不用.现实情况是复杂的,编译器比我考虑的多的多.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值