• 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。

  • 相关阅读:
    期中考试补完计划
    c++简单程序设计-4
    c++简单程序设计-3
    c++简单程序设计-2
    c++简单程序设计-1
    layer ifram 弹出框
    定时发邮件
    二维码生成
    文件或文件夹的压缩
    excel 导入 与 导出
  • 原文地址:https://www.cnblogs.com/wangshaowei/p/8628478.html
Copyright © 2020-2023  润新知