需要考虑内存重叠的情况
#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里写到目的地址,增加了一次不必要的开销。
参考链接:
1. https://www.nowcoder.com/questionTerminal/9602083ec8d749999d86adf8a725b4f7
2. https://blog.csdn.net/FreeeLinux/article/details/53505563