memcpy
/***
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--;
}
return ret;
}
strcpy
char *strcpy( char *strDestination, const char *strSource )
{
char *strTemp = strDestination;
while(*strTemp ++ = *strSource++);
return strDestination;
}
equal
template <class InputIterator1, class InputIterator2>
inline bool equal(InputIterator1 first1, InputIterator1 last1,
InputIterator2 firtst2)
{
for (; first1 != last1; ++first1, ++first2)// 序列2的元素个数少于序列1的元素个数,会出问题
if (*first1 != *first2)
return false;
return true;// 该函数忽略了序列2多余的元素
}