memcpy 和 memmove 都是C语言提供的内存拷贝函数。
memcpy的函数实现
linux 实现版本
#include <assert.h> // assert 需要的头文件
void* memcpy(void * dest, void *src, size_t count)
{
assert(src != NULL && src != NULL);
char *tmp = (char *)dest;
const char* s = (const char*)src;
for (size_t i = 0; i < count; i++)
{
tmp[i] = s[i];
}
return dest;
}
<pre name="code" class="cpp">void* memcpy(void * dest, void *src, size_t count)
{
void *ret = dest;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
return ret;
}
该函数有极大缺陷,如内存重复的问题等。
memmove就是一个比较好的选择
void* memmove(void *dest, const void *src, size_t count)
{
void* ret = dest;
if (dest <= src || (char*)dest >= (char*)src + count)
{
while (count--)
{
*(char*) dest = *(char*)src;
dest = (char*)dest + 1;
src = (char*)src + 1;
}
}
else
{
dest = (char*)dest + count - 1;
src = (char*)src + count - 1;
while (count--)
{
*(char*)dest = *(char*)src;
dest = (char*)dest - 1;
src = (char*)src - 1;
}
}
return (ret);
}
当src和dest区域没有重叠时,两个函数是完全一样的。木有重叠的条件是: dst <= src || (char *)dst >= ((char *)src + count 。否则,memcpy是不能正常工作的,memmove是可以正常工作的。