实现memcpy

作者: darkness605 | 来源:发表于2020-09-29 00:18 被阅读0次

memcpy的函数原型:

void *memcpy(void *dest, const void *src, size_t n);
//dest 是要拷贝到的目标内存区域,src是被拷贝的内存区域,n是拷贝的字节长度。

这里有个重要的问题就是,memcpy可能发生内存重叠。
主要有以下两种内存重叠情况。

image.png
由于拷贝是从低地址开始,按字节进行拷贝的。
在第一种内存重叠的情况下,可以不用进行特殊处理,因为dest<=src的时候,按字节拷贝,1、2、3拷贝完了以后,到4的时候,覆盖了src的1数值,其实已经不影响了,因为1已经拷贝完成了。
可以归到正常情况,(char)dest>=(char)src+n的时候。
第二种情况的话,当dest>src,并且dest<src+n的时候,就会出现问题。因为src中4的地址被dest拷贝1的时候已经覆盖了,那到了要拷贝src4的时候,就不再是4而是1了。
根据以上可以得出代码
void *memcpy(void *dest, const void *src,size_t n)
{
if(dest==nullptr||src==nullptr)
    return nullptr;
void *res = dest;
if(dest<=src||(char*)dest>=(char*)src+n){
        while(len--){
//从低地址开始复制
        *(char*)dest =*(char*)src;
        dest=(char*)dest+1;
        src=(char*)src+1;
        }
}
else{
//从高地址开始复制
      src = (char*)src + len -1;
      dst = (char*)dst + len -1;
      while(len--){
            *(char*)dst = *(char*)src;
            dst = (char*)dst -1;
            src = (char*)src -1;
          }
    }
return res;
}

实际上:我们上面写出的改进版memcpy就是memove函数的实现方式。

相关文章

  • memcpy实现及其优化

    1. 版本一 2. 版本2:改进 分析:版本一的memcpy实现的是char到char的拷贝的循环,效率可能不高,...

  • memcpy函数的实现

    1.按1个字节拷贝(1)不要直接使用形参,要转换成char*(2)目标地址要实现保存(3)要考虑源和目标内存重叠的...

  • C memset和memcpy解析

    memcpy:extern void *memcpy(void *dest, void *src, unsigne...

  • 数组拷贝函数

    memcpy 函数原型:void *memcpy(void *dest, const void *src, siz...

  • Duff

    一种循环展开的策略:“小步合并成为大步”,在memcpy的实现中有用到。image.pngimage.png

  • memcpy

    memcpy指的是c和c++使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝...

  • strcpy函数和memcpy

    strcpy和memcpy的区别

  • memcpy与memmove的区别

    memcpy和memmove都是C语言的库函数,相比于strcpy和strncpy只能拷贝字符串数组,memcpy...

  • memmove 和 memcpy 的区别

    memmove和memcpy都是拷贝,区别是memmove会判断方向,如果有重叠的区域那么memcpy就会有问题 ...

  • 汇编实现的memcpy和memset

    天天山珍海味的吃,也会烦。偶尔来点花生,毛豆小酌一点,也别有一番风味。 天天java, golang, c++, ...

网友评论

    本文标题:实现memcpy

    本文链接:https://www.haomeiwen.com/subject/zcgyuktx.html