天天看點

memmove函數

寫一個函數,完成記憶體之間的拷貝

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的值。當源記憶體區域和目标記憶體區域無交叉時,兩者的結果是一樣的,但如果有交叉呢?先看下圖:

memmove函數

圖的上半部分為源記憶體區域在目标記憶體區域右邊,下半部分為源記憶體區域在目标區域左邊,源記憶體區域和目标記憶體區域都有交叉。

memcpy()是從src的起始部分開始複制,是以雖然第一種情況下沒有問題,但如果遇到第二種情況,則會發生錯誤,如圖所示,後兩個位元組在被複制前已經被覆寫掉了。而memmove()則由于采用了不同的複制機制,是以可以正确處理第二種情況。

本文轉自夏雪冬日部落格園部落格,原文連結:http://www.cnblogs.com/heyonggang/p/3196757.html,如需轉載請自行聯系原作者

繼續閱讀