3 回答

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

TA貢獻(xiàn)1796條經(jīng)驗(yàn) 獲得超4個(gè)贊
中的內(nèi)存memcpy 不能重疊,否則您可能會(huì)面臨不確定的行為,而其中的內(nèi)存memmove可能會(huì)重疊。
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的某些實(shí)現(xiàn)可能仍適用于重疊的輸入,但是您不能指望這種行為。雖然記憶必須允許重疊。
- 3 回答
- 0 關(guān)注
- 620 瀏覽
添加回答
舉報(bào)