前面講到memcpy把源緩衝區的資料賦值到目標緩衝區中。再來看一下該函式宣告
void *memcpy( void *dest, const
void *src, size_t count );
他並沒有規定src所指向緩衝區與dest指向緩衝區必須不同。比如出現這種情況
char s[32] = "abcdefg";
2:char* p = s;
3: p++:
4: memcpy(p,s,32);這種情況標準未定義,具體到專案裡會咋樣,還得看你人品。不管怎麼說,那就是乙個bug!
那再來看看memmove是怎麼樣解決這樣的問題的:
memmove用於從source拷貝count個字元到dest,如果目標區域和源區域有重疊的話,memmove能夠保證源串在被覆蓋之前將重疊區域的位元組拷貝到目標區域中。
/***
2:*purpose:
3:* memmove() copies a source memory buffer to a destination memory buffer.
4:
5:* for cases where propogation is not a problem, memcpy() can be used.
6:*
7:*entry:
8:* void *dst = pointer to destination buffer
9:* const void *src = pointer to source buffer
10:* size_t count = number of bytes to copy
11:*
12:*exit:
13:* returns a pointer to the destination buffer
14:*
15:*exceptions:
16:***/
17:template
18:inline t *tmemmove(t *pdest, t *psrc, unsigned
int ucnt)
19:
33: }
34:else
35:
48: }
49:
50:return (pret);
51: }看到了吧,很聰明的做法。先判斷源緩衝區與目標緩衝區是否重疊,即判斷目標緩衝區首位址是否在源緩衝區位址內。如果不在,則從首位址開始一位元組一位元組的複製。如果在,則從源緩衝區和目標緩衝區的尾位址向首位址移動而複製。
妙~問題迎刃而解。
memcpy與memmove的區別:
1.函式memcpy()從source指向的區域向dest指向的區域複製count個字元,如果兩陣列重疊,不定義該函式的行為。 而memmove(),如果兩函式重疊,賦值仍正確進行。
2.memcpy函式假設要複製的記憶體區域不存在重疊,如果你能確保你進行複製操作的的記憶體區域沒有任何重疊,可以直接用memcpy; 如果你不能保證是否有重疊,為了確保複製的正確性,你必須用memmove。
3.memcpy的效率會比memmove高一些
測試volatile tchar str1 = _t("aabbccaaaabbccaaaabbccaaaabbccaaaabbccaaaabbccaa");
2:volatile tchar str2[1024] = ;
3:
4:volatile
const dword dwcount = 1000000;
5:
6: dword dwlast = 0;
7:
13: }
14: cout << dwlast << endl;
15:
16: dwlast = 0;
17:
23: }
24: cout << dwlast << endl;故意製造了記憶體重疊,測試結果又點意外。居然是我的模板函式略勝一籌
一天乙個CRT函式 strdec
換作業系統了,win7果然好用!而且對於每天12小時以上盯 著電腦的我來說,視覺感受也很重要!贊,乙個字!來看看 strdec字串函式吧,該函式比較兩字串,pstr1和pstr2必須指向同一source,如果pstr2所指向pstr1的後面的字元,則返回pstr2前乙個位置的字元位址,否則返回nul...
一天乙個西紅柿,健康多多
剛才在5餐發現有新鮮的西紅柿賣,本人很喜歡吃西紅柿,故上網搜來文章看看西紅柿的好處 1.滿足人體對幾種維生素和礦物質的需要 2抑制細菌的作用 3有助於消化的功能 4遠離心臟疾病,降低血壓 5癌症的發病率明顯下降,男同志一天乙個西紅柿,前列腺癌減少45 6還可推遲某些細胞的衰老,美容養顏等 原文如下 ...
一天乙個Linux命令 cp
cp命令用來將乙個或多個原始檔或者目錄複製到指定的目的檔案或目錄。它可以將單個原始檔複製成乙個指定檔名的具體的檔案或乙個已經存在的目錄下。cp命令還支援同時複製多個檔案,當一次複製多個檔案時,目標檔案引數必須是乙個已經存在的目錄,否則將出現錯誤。一般情況下,在命令列下複製檔案時,如果目標檔案已經存在...