转自: http://blog.youkuaiyun.com/gxy837/article/details/6144600
memmove(
void * memmove ( void * destination, const void * source, size_t num );)是<string.h>的标准函数,其作用是把从source开始的num个字符拷贝到destination。 最简单的方法是直接复制,但是由于它们可能存在内存的重叠区,因此可能覆盖了原有数据。 比如当source+count>=dest&&source<dest时,dest可能覆盖了原有source的数据。 解决办法是从后往前拷贝。 对于其它情况,则从前往后拷贝。 源代码如下: ;*** ;memcpy.asm - contains memcpy and memmove routines ; ; Copyright (c) 1986-1997, Microsoft Corporation. All right reserved. ; ;Purpose: ; memcpy() copies a source memory buffer to a destination buffer. ; Overlapping buffers are not treated specially, so propogation may occur. ; memmove() copies a source memory buffer to a destination buffer. ; Overlapping buffers are treated specially, to avoid propogation. ; ;******************************************************************************* ;*** ;memcpy - Copy source buffer to destination buffer ; ;Purpose: ; memcpy() copies a source memory buffer to a destination memory buffer. ; This routine does NOT recognize overlapping buffers, and thus can lead ; to propogation. ; For cases where propogation must be avoided, memmove() must be used. ; ; Algorithm:
void* memcpy(void* dest, void* source, size_t count)
{
void* ret = dest;
//copy from lower address to higher address
while (count--)
*dest++ = *source;
return ret;
}
memmove
memmove - Copy source buffer to destination buffer
;
;Purpose:
; memmove() copies a source memory buffer to a destination memory buffer.
; This routine recognize overlapping buffers to avoid propogation.
; For cases where propogation is not a problem, memcpy() can be used.
;
; Algorithm:
void* memmove(void* dest, void* source, size_t count)
{
void* ret = dest;
if (dest <= source || dest >= (source + count))
{
//Non-Overlapping Buffers
//copy from lower addresses to higher addresses
while (count --)
*dest++ = *source++;
}
else
{
//Overlapping Buffers
//copy from higher addresses to lower addresses
dest += count - 1;
source += count - 1;
while (count--)
*dest-- = *source--;l
}
return ret;
}