3 回答

TA貢獻1834條經(jīng)驗 獲得超8個贊
對于您的示例沒有任何奇怪的行為,我并不感到完全驚訝。嘗試復制str1到str1+2,然后看看會發(fā)生什么。(實際上可能沒有什么不同,取決于編譯器/庫。)
通常,memcpy以簡單(但快速)的方式實現(xiàn)。簡單地說,它只是按順序循環(huán)數(shù)據(jù),從一個位置復制到另一個位置。這可能會導致在讀取源時將其覆蓋。
Memmove會做更多的工作來確保正確處理重疊。
編輯:
(不幸的是,我找不到合適的例子,但是這些都可以)。對比此處顯示的memcpy和memmove實現(xiàn)。memcpy只是循環(huán),而memmove執(zhí)行測試以確定循環(huán)方向,以免破壞數(shù)據(jù)。這些實現(xiàn)非常簡單。大多數(shù)高性能的實現(xiàn)更為復雜(涉及一次復制字大小的塊而不是字節(jié))。

TA貢獻1796條經(jīng)驗 獲得超4個贊
中的內存memcpy 不能重疊,否則您可能會面臨不確定的行為,而其中的內存memmove可能會重疊。
char a[16];
char b[16];
memcpy(a,b,16); // valid
memmove(a,b,16); // Also valid, but slower than memcpy.
memcpy(&a[0], &a[1],10); // Not valid since it overlaps.
memmove(&a[0], &a[1],10); // valid.
memcpy的某些實現(xiàn)可能仍適用于重疊的輸入,但是您不能指望這種行為。雖然記憶必須允許重疊。
- 3 回答
- 0 關注
- 624 瀏覽
添加回答
舉報