1. 程式人生 > >memcpy memmove區別和實現(如何處理記憶體重疊問題)

memcpy memmove區別和實現(如何處理記憶體重疊問題)

memcpy與memmove的目的都是將N個位元組的源記憶體地址的內容拷貝到目標記憶體地址中。

但當源記憶體和目標記憶體存在重疊時,memcpy會出現錯誤,而memmove能正確地實施拷貝,但這也增加了一點點開銷。

memmove的處理措施:

(1)當源記憶體的首地址等於目標記憶體的首地址時,不進行任何拷貝

(2)當源記憶體的首地址大於目標記憶體的首地址時,實行正向拷貝

(3)當源記憶體的首地址小於目標記憶體的首地址時,實行反向拷貝

-- memcpy實現

1 2 3 4 5 6 7 8 voidmemcpy(void* dest, const void* src, 
size_t n) { char*      d = (char*) dest; const char*  s = (const char*) src; while(n-–) *d++ = *s++; return dest; }

-- memmove實現

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 voidmemmove(void* dest, const void* src, size_t n) { char*     d  = (
char*) dest; const char*  s = (const char*) src; if (s>d) { // start at beginning of s while (n--) *d++ = *s++; } else if (s<d) { // start at end of s d = d+n-1; s = s+n-1; while (n--) *d-- = *s--; } return dest; }

 示意圖:

(1)記憶體低端<-----s-----><-----d----->
記憶體高階 start at end of s
(2)記憶體低端<-----s--<==>--d----->      記憶體高階 start at end of s
(3)記憶體低端<-----sd----->              記憶體高階 do nothing
(4)記憶體低端<-----d--<==>--s----->      記憶體高階 start at beginning of s
(5)記憶體低端<-----d-----><-----s-----> 記憶體高階 start at beginning of s