设为首页 加入收藏

TOP

面试:实现内存复制函数(三)
2012-11-28 12:58:58 来源: 作者: 【 】 浏览:790
Tags:面试 实现 内存 复制 函数

 

    0.4

    [cpp]

    void memcpy(void *dst, const void *src, size_t count)

    {

    assert(dst != NULL);

    assert(src != NULL);

    unsigned char *pdst = (unsigned char *)dst;

    const unsigned char *psrc = (const unsigned char *)src;

    while(count--)

    {

    *pdst = *psrc;

    pdst++;

    psrc++;

    }

    }

    如果有这样的数组

    char ina[]={0,1,2,3,4,5,6,7,8,9,10,11};

    进行如下调用

    memcpy(&ina , &ina[0], 5);

    会发生什么情况

    由于原始数据和目的数据在空间上存在重叠,这样导致复制过程中不可避免会对原始数据做修改.而这样的修改在函数的声明中是看不到的(const void *src).如果降低要求,可以修改原始数据完成复制,那么这样的设计能实现么 这里有一个版本可供参考.但是这样的实现使得函数的功能不明确,可以认为是一种异常情况.

    因此

    0.5

    [cpp]

    void memcpy(void *dst, const void *src, size_t count)

    {

    assert(dst != NULL);

    assert(src != NULL);

    unsigned char *pdst = (unsigned char *)dst;

    const unsigned char *psrc = (const unsigned char *)src;

    assert(!(psrc<=pdst && pdst<psrc+count));//判断是否有重叠

    assert(!(pdst<=psrc && psrc<pdst+count));

    while(count--)

    {

    *pdst = *psrc;

    pdst++;

    psrc++;

    }

    }

    到这里实现已经比较健壮了.有些人想要链式的调用函数,也就是复制完内存后,返回值直接当做其他函数的参数.

    [cpp]

    void * memcpy(void *dst, const void *src, size_t count)

    0.6因此最终版本为

    [cpp]

    void* memcpy(void *dst, const void *src, size_t count)

    {

    assert(dst != NULL);

    assert(src != NULL);

    unsigned char *pdst = (unsigned char *)dst;

    const unsigned char *psrc = (const unsigned char *)src;

    assert(!(psrc<=pdst && pdst<psrc+count));

    assert(!(pdst<=psrc && psrc<pdst+count));

    while(count--)

    {

    *pdst = *psrc;

    pdst++;

    psrc++;

    }

    return dst;

    }

    最后,有网友做了性能测试,结论显示上面的实现达不到库函数的性能.个人认为库函数可能做了优化,例如使用mmx技术,使得一次复制一个字节到一次复制多个字节.

    这个题目在面试出现的次数太频繁,能够比较正确的写出这个函数的能说明什么呢

    1.缺乏项目经验,对于面试因此复习的很到位.

    2.有可能有丰富的项目经验,在项目中也这么做.

    3.认为有较多项目经验,但是没有注意非功能性要求.等着杯具

      

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇hdu 4430 Yukari's.. 下一篇C++激活外部文件或程序

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: