关于memcpy

来源:互联网 发布:淘宝拍卖手表骗局揭秘 编辑:程序博客网 时间:2024/04/26 20:22

  好吧,memcpy,我又把你忘记

普通版memcpy实现

void* memcpy( void* dest, const void* src, size_t count )
{

if (count<0)

{printf("Invalid count number !./n");

return (void*)0;}

if(src==NULL||dest==NULL)

return (void*)0 ;

if ((unsigned int)dest==(unsigned int)src)

{printf("The source is equal with the destanation!./n");

return dest;}

    char* d = (char*)dest;
    const char* s = (const char*)src;
while(count--) 
     *d++ = *s++;
    return dest;
}


文艺版memcpy实现

         void *memcpy(void *pvTo, const void *pvFrom, size_t size)

{

        assert((pvTo != NULL) && (pvFrom != NULL));     // 使用断言

        byte *pbTo = (byte *) pvTo;     // 防止改变pvTo的地址

        byte *pbFrom = (byte *) pvFrom; // 防止改变pvFrom的地址

        while(size -- > 0 )

            *pbTo ++ = *pbFrom ++ ;

        return pvTo;

}

嗯,来自高质量C++/C编程指南。byte是unsigned char?原书没再提过。


XX版memcpy实现

void* mymemcpy( void* dest, const void* src, size_t count )
{
    char* d = (char*)dest;
    const char* s = (const char*)src;
    int n = (count + 7) / 8; // count > 0 assumed  没有检查count为0的情况

    switch( count & 7 )
    {
    case 0: do { *d++ = *s++;
    case 7:        *d++ = *s++;
    case 6:        *d++ = *s++;
    case 5:        *d++ = *s++;
    case 4:        *d++ = *s++;
    case 3:        *d++ = *s++;
    case 2:        *d++ = *s++;
    case 1:        *d++ = *s++;
               } while (--n > 0);
    }

    return dest;
}


原创粉丝点击