实现一个Memcpy函数

需要考虑内存重叠的情况

#include<bits/stdc++.h>
using namespace std;


void *memcpy(void *dst, const void *src, size_t len)
{
    if(NULL == dst || NULL == src){
        return NULL;
    }

    void *ret = dst;

    if(dst <= src){
        //dst在前,从低地址开始复制(可能有内存重叠)
        while(len--){
            *(char *)dst = *(char *)src;  // char正好是一个字节,按一个字节一个字节的拷贝
            dst = (char *)dst + 1;
            src = (char *)src + 1;
        }
    }else{
        //src在前,从高地址开始复制(可能有内存重叠)
        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 ret;
}

int main()
{
    char a[20] = "1234567";
    cout << (char*)memcpy(a, a+2, 5) << endl;    // 3456767, a会被修改
    cout << (char*)memcpy(a+2, a, 5) << endl;    // 34567
}

标准库也提供了地址重叠时的内存拷贝函数:memmove(),

那么为什么还要考虑重写memcpy()函数呢?

因为memmove()函数的实现效率问题,该函数把源字符串拷贝到临时buf里,然后再从临时buf里写到目的地址,增加了一次不必要的开销。

因为memcpy不需要判断重叠,所以它运行速度比memmove快,在确定dst和src不重叠的情况下,可以用memcpy。

 

 

参考链接:

1. https://www.nowcoder.com/questionTerminal/9602083ec8d749999d86adf8a725b4f7

2. https://blog.csdn.net/FreeeLinux/article/details/53505563

posted @ 2020-04-13 22:58  Rogn  阅读(584)  评论(0编辑  收藏  举报