[問題] 關於memcpy的但書

看板C_and_CPP作者 (不拉屎就離開茅坑)時間14年前 (2010/07/10 09:10), 編輯推噓7(709)
留言16則, 5人參與, 最新討論串1/2 (看更多)
請問一下 假設memcpy的宣告如下: void * memcpy ( void * destination, const void * source, size_t num ); 則memcpy有兩個但書: 1.To avoid overflows, the size of the arrays pointed by both the destination and source parameters, shall be at least num bytes, 2.and should not overlap. 第一個但書我們可以控制 但請問我們要如何確定第二個但書 也就是 如何確保這兩塊memory不會重疊到呢? 謝謝 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.112.167.196 ※ 編輯: timemaker 來自: 59.112.167.196 (07/10 09:10)

07/10 09:34, , 1F
不要用同一塊malloc出來的記憶體
07/10 09:34, 1F

07/10 09:35, , 2F
也不要用同一塊宣告好的array等空間
07/10 09:35, 2F

07/10 09:35, , 3F
我覺得它只是想表達這樣的限制
07/10 09:35, 3F

07/10 09:36, , 4F
基本上 你不論是宣告或是new,OS不會給你重疊的區域
07/10 09:36, 4F

07/10 09:37, , 5F
上面說的是 dest 跟 src 兩個參數不要用同一個空間
07/10 09:37, 5F

07/10 09:37, , 6F
確保 destination + num <= source 或是 source + num
07/10 09:37, 6F

07/10 09:38, , 7F
<= destination
07/10 09:38, 7F

07/10 09:38, , 8F
memmove will be better.
07/10 09:38, 8F

07/10 09:43, , 9F
↑因為 memmove 多了暫存區.
07/10 09:43, 9F

07/10 10:20, , 10F
去google code search 拉 libc\memcpy和memmove 來看沒差
07/10 10:20, 10F

07/10 10:21, , 11F
如果要tune performance,mov mem之後base reg, 可以選擇
07/10 10:21, 11F

07/10 10:22, , 12F
遞增遞減, 無論是 x84 or ARM 的 assembly 都有支援
07/10 10:22, 12F

07/10 10:25, , 13F
規格書中沒寫 memcpy 要不要用暫存區, 實作各異
07/10 10:25, 13F

07/10 14:30, , 14F
memmove我記得是會判斷兩塊記憶體先後來決定copy的順序
07/10 14:30, 14F

07/10 14:31, , 15F
如果dest比較後面src就先從後面address開始 反之從前面
07/10 14:31, 15F

07/10 20:23, , 16F
memmove 效能會打折, 畢竟一般情況不太會重疊
07/10 20:23, 16F
文章代碼(AID): #1CDyXnGh (C_and_CPP)
文章代碼(AID): #1CDyXnGh (C_and_CPP)