内存拷贝的实现,重写memcpy

#include <iostream>

using namespace std;

void  *mymemcpy(void *dest, const void *src, size_t count)
 {
        assert((src != NULL)&&(dest != NULL));
        char *tmp,*s;

        if(dest <= src)
        {
               tmp = (char *) dest;
               s = (char *) src;
               while(count--)
                      *tmp++ = *s++;
        }
        else {
               tmp = (char *) dest + count;
               s = (char *) src + count;
         while(count--)
             *tmp-- = *s--;
}
        return dest;
 }

int main(int argc, char* argv[])
{
    char arr2[]="2xoidfsflsdfsa";
    int len = sizeof(arr2)/sizeof(char);
    cout << len << '\n';
    char arr1[len];
    mymemcpy(arr1,arr2,len);
    for(char &x : arr1)
        cout << x;
    cout << '\n';
    return 0;
}

标准库也提供了地址重叠时的内存拷贝函数:memmove(),那么为什么还要考虑重写memcpy()函数呢?因为memmove()函数的实现效率问题,该函数把源字符串拷贝到临时buf里,然后再从临时buf里写到目的地址,增加了一次不必要的开销。

可以看到memcpy对于地址重叠(overlap)是未定义的

复制代码
#include <iostream>
using namespace std;
void *Memcpy(void *dst,const void *src,size_t size)
{
    char *pdst=(char *)dst;
    char *psrc=(char *)src;
    
    if(dst==NULL || src==NULL)
        return NULL;
       //如果src和dst有重叠,则从后往前进行复制
    if((src<dst) &&(char *)src+size>(char *)dst)
    {
        pdst=(char *)dst+size-1;
        psrc=(char *)src+size-1;
        
        while(size--)
        {
            *pdst--=*psrc--;
        }
    }
    else//否则正常复制就好了
    {
        pdst=(char *)dst;
        psrc=(char *)src;
        
        while(size--)
        {
            *pdst--=*psrc--;
        }
    }
    return dst;
}
int main()
{
    char buff[100]="abcdefghijk";
    Memcpy(buff+2, buff, 5);
    cout<<buff<<endl;
}


//https://blog.csdn.net/weixin_42226134/article/details/104878232
复制代码

 


posted @   PKICA  阅读(801)  评论(0编辑  收藏  举报
编辑推荐:
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示