寫一個函數,完成記憶體之間的拷貝
void* mymemcpy( void *dest, const void *src, size_t count )
{
char* pdest = static_cast<char*>( dest );
const char* psrc = static_cast<const char*>( src );
if( pdest>psrc && pdest<psrc+cout ) 能考慮到這種情況就行了
{
for( size_t i=count-1; i!=-1; --i )
pdest[i] = psrc[i];
}
else
for( size_t i=0; i<count; ++i )
pdest[i] = psrc[i];
return dest;
}
memmove和memcpy的差別:
1.memmove
函數原型:void *memmove(void *dest, const void *source, size_t count)
傳回值說明:傳回指向dest的void *指針
參數說明:dest,source分别為目标串和源串的首位址。count為要移動的字元的個數
函數說明:memmove用于從source拷貝count個字元到dest,如果目标區域和源區域有重疊的話,memmove能夠保證源串在被覆寫之前将重疊區域的位元組拷貝到目标區域中。
2.memcpy
函數原型:void *memcpy(void *dest, const void *source, size_t count);
函數說明:memcpy功能和memmove相同,但是memcpy中dest和source中的區域不能重疊,否則會出現未知結果。
3.兩者差別
函數memcpy() 從source 指向的區域向dest指向的區域複制count個字元,如果兩數組重疊,不定義該函數的行為。
而memmove(),如果兩函數重疊,指派仍正确進行。
memcpy函數假設要複制的記憶體區域不存在重疊,如果你能確定你進行複制操作的的記憶體區域沒有任何重疊,可以直接用memcpy;
如果你不能保證是否有重疊,為了確定複制的正确性,你必須用memmove。
memcpy的效率會比memmove高一些,如果還不明白的話可以看一些兩者的實作:
void *memmove(void *dest, const void *source, size_t count)
assert((NULL != dest) && (NULL != source));
char *tmp_source, *tmp_dest;
tmp_source = (char *)source;
tmp_dest = (char *)dest;
if((dest + count<source) || (source + count) <dest))
{// 如果沒有重疊區域
while(count--)
*tmp_dest++ = *tmp_source++;
}
else
{ //如果有重疊
tmp_source += count - 1;
tmp_dest += count - 1;
while(count--)
*--tmp_dest = *--tmp;
return dest;
void *memcpy(void *dest, const void *source, size_t count)
char *tmp_dest = (char *)dest;
char *tmp_source = (char *)source;
while(count --)//不對是否存在重疊區域進行判斷
*tmp_dest ++ = *tmp_source ++;
return dest;
memcpy()和memmove()都是C語言中的庫函數,在頭檔案string.h中,其原型分别如下:
<code>void*memcpy(void*dst, const void *src, size_t count); void *memmove(void*dst, const void *src, size_t count);</code>
它們都是從src所指向的記憶體中複制count個位元組到dst所指記憶體中,并傳回dst的值。當源記憶體區域和目标記憶體區域無交叉時,兩者的結果是一樣的,但如果有交叉呢?先看下圖:

圖的上半部分為源記憶體區域在目标記憶體區域右邊,下半部分為源記憶體區域在目标區域左邊,源記憶體區域和目标記憶體區域都有交叉。
memcpy()是從src的起始部分開始複制,是以雖然第一種情況下沒有問題,但如果遇到第二種情況,則會發生錯誤,如圖所示,後兩個位元組在被複制前已經被覆寫掉了。而memmove()則由于采用了不同的複制機制,是以可以正确處理第二種情況。
本文轉自夏雪冬日部落格園部落格,原文連結:http://www.cnblogs.com/heyonggang/p/3196757.html,如需轉載請自行聯系原作者