目录
一、问题由来
C库中已提供有原生的memcpy、memmove以及strcpy等函数,位于<string.h>头文件中。
void *memcpy(void *dst, const void *src, size_t n);
上面是C库中原生的memcpy声明,该memcpy在dst与src两者的内存地址不互相重叠时,可以得到正确的处理结果,而两者的内存地址有重叠时,该接口并不保证处理结果的正确性。
接着则是memmove在string.h中的声明,memmove比memcpy更先进的原因则在于:它解决了内存重叠时的拷贝情形。但memmove在不同编译器上的实现会有所不同,故memmove在内存不重叠时,不一定会比memcpy更快。
void *memmove(void *dst, const void *src, size_t count)
再观之strcpy的函数原型,发现其声明与memcpy有几分相似,从中也可以看出:memcpy和memmove比strcpy的适用范围更大,strcpy只是它们的特殊情形。
char *strcpy(char *dest, const char *src)
说到此,不论是探索的需求,还是面试的需求,想必读者已经迫不及待地想要手撕一遍memcpy和strcpy的实现了,here we go! (但先说好了,咱们只是原理上的实现,而不是探索极致的效率,真正的源码情况会考虑到更多的情况。)
二、动手实现你的memcpy
1.单字节拷贝
src与dest两者的相对位置存在好几种可能性,有些相对位置不会影响到拷贝的结果,而有些则会影响到拷贝的结果。
情形1:src + size < dest,即待拷贝区域与dest区域不重叠
这种情形下,只需将src中的数据从前往后挨个地拷贝到dest中即可。
情形2:dest与src的区域有重叠,但dest < src