void *memcpy(void*dst, const void *src, size_t count);
void *memmove(void*dst, const void *src, size_t count);
它们都是从src所指向的内存中复制count个字节到dst所指内存中,并返回dst的值。
memmove 能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。
memcpy 如果两数组重叠,不定义该函数的行为。
memcpy 的效率会比 memmove 高一些。
// 直接看代码一切明了
void * __cdecl memmove(void *dst, const void *src, size_t count )
{
void *ret = dst;
if (dst <= src || (char *)dst >= ((char *)src + count))
{
/*
* 无重叠的缓冲区
* 从较低的地址复制到较高的地址
*/
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
else
{
/*
* 有重叠的缓冲区
* 从较高的地址复制到较低的地址
*/
dst = (char *)dst + count - 1;
src = (char *)src + count - 1;
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst - 1;
src = (char *)src - 1;
}
}
return(ret);
}
void * __cdecl memcpy(void *dst ,const void *src, size_t count)
{
void *ret = dst;
/*
* 从较低的地址复制到较高的地址
*/
while (count--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}