C/C++ memmove与memcpy的区别及实现

 

1.与字符串函数strcpy区别:

 

  • memcpy与memmove都是对内存进行拷贝可以拷贝任何内容,而strcpy仅是对字符串进行操作。
  • memcpy与memmove拷贝多少是通过其第三个参数进行控制而strcpy是当拷贝至''停止。

 

2.函数说明:         

 

  1. memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝N个字节到目标dst所指的内存地址的起始位置中。
  2. memmove函数的功能同memcpy基本一致,但是当src区域和dst内存区域重叠时,memcpy可能会出现错误,而memmove能正确进行拷贝。

3.代码实现

  1)memcpy

  

void* memcpy(void* memTo, void* memFrom, size_t size)  
{  
    assert(memTo != NULL && memFrom != NULL);  
    char* temFrom = (char*)memFrom;  
    char* temTo = (char*)memTo;  
    while(size-- > 0)  
        *temTo++ = *temFrom++;  
    return memTo;  
}  

  挺简单的,使用深复制

  2)memmove

void* memmove(void* dst,const void* src,size_t count)
{
    void* ret = dst;
    //dst <= src表示,如果dst在src的前面,从前往后复制不会覆盖src中还没有复制的内容

    if (dst <= src || (char*)dst >= ((char*)src + count))
    {
        //从前往后复制,则不会出现覆盖src中没有复制的内容
        while(count--)
        {
            *(char*)dst = *(char*)src; //char类型指针,表示一个字节一个字节的复制
            dst = (char*)dst + 1; //移动一个字节
            src = (char*)src + 1;
        }
    }
    else
    {
        //从后往前复制,则不会出现覆盖src中没有复制的内容
        dst = (char*)dst + count - 1;//移动到末尾
        src = (char*)src + count - 1;
        while(count--)
        {
            *(char*)dst = *(char*)src;
            dst = (char*)dst - 1; //移动一个字节
            src = (char*)src - 1;
        }
    }
    //返回dst的头指针,还方便左值操作。
    //如:ptstr = memmove(ptstr,src,count); cout << memmove(ptstr,src,count);
    return ret; 
}

代码中描述的就是以下两种情况

  

最后,memcpy在内存没有重复的情况下能够正确复制,若有重叠情况则复制结果错误,但是它的效率比memmove高。所以,在确定没有重复的情况下用memcpy,在不确定是否有内存重复的情况用memmove。

原文地址:https://www.cnblogs.com/wangshaowei/p/8628478.html