1、RtlCopyMemory與RtlMoveMemory
這兩個函數是內核函數api,對應Win32 API是CopyMemory和MoveMemory。都能實現內存塊的複製,兩者的區別在於CopyMemory是非重疊內存區域的複製,MoveMemory可以不考慮是否重疊,都可以安全複製。
CopyMemory實現如下:
void *memmcpy(void *dest , const void *src , size_t count)
{
assert( (dest != NULL) && (src != NULL)); //安全檢查
assert( count > 0 );
char *psrc = (char *) src;
char *pdest = (char *) dest;
while( count-- )
*pdest++ = *psrc++;
return dest;
}
MoveMemory具體實現:
void *memmove(void *dest , const void *src , size_t count)
{
assert( (dest != NULL) && (src != NULL)); //安全檢查
assert( count > 0 );
char *psrc = (char *) src;
char *pdest = (char *) dest;
//檢查是否有重疊問題
if( pdest < psrc )
{
//正向拷貝
while( count-- )
*pdest++ = *psrc++;
}
else if( psrc < pdest )
{
//反向拷貝
psrc = psrc + count - 1;
pdest = pdest + count - 1;
while( count-- )
*pdest-- = *psrc--;
}
return dest;
}
MoveMemory實現中有判斷目的地址和源地址值,如果目的地址值小於源地址值,正向拷貝,如果目的地址值大於源地址值,反向拷貝