上篇文章中,我们探讨了memcpy的缺陷,发现memcpy不能够实现后向拷贝,最后我们提出了其解决方案,本篇文章我们就来实现该方法,即memmove的实现
第一眼看到memmove的时候,第一映像是,memmove是将源数据剪切到目的地址,然后将源数据进行清除了,其实memmove就是拷贝的意思,只是在memcpy的基础上,增加了一个后向拷贝数据,实现原理如下所示
void *memmove(void *dest, void *src, unsigned long count)
{
char *tmp;
const char *s;
if (dest <= src) {
/*
tmp = dest;
s = src;
while (count--) {
*tmp++ = *src++;
}
*/
memcpy(dest, src, count);
}
else {
tmp = dest;
tmp += count;
s = src;
s += count;
while (count--) {
*--tmp = *--s;
}
}
}
从以上实现中,我们可以发现,当拷贝是前向拷贝的时候,我们可以memmove可以调用memcpy进行,当后向拷贝的时候,我们通过先拷贝重叠部分数据即可。
因此,memmove不论前向拷贝,还是后向拷贝总体思想就是优先拷贝重叠数据