作者charleshu (Analog Engineer)
看板C_and_CPP
標題Re: [問題] 關於memcpy的但書
時間Sun Jul 11 14:02:01 2010
※ 引述《timemaker (不拉屎就離開茅坑)》之銘言:
: 請問一下
: 假設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不會重疊到呢?
: 謝謝
memcpy會影響到的記憶體區間是 dest..dest+len, 與src..src+len, 這段區間有沒有重疊
應該不難判斷.
memmove功能上與memcpy一樣, 只是它會試情況決定從頭開始搬還是從尾巴開始搬.
memcpy假如搬移重疊的位置會有資料覆蓋的問題, 但它也可能對你的程式而言不是問題,
如LZ77解壓縮演算法時的搬移.
從前往後搬時覆蓋位於後面的目的地並不會有問題.
從後往前搬時,若後面的資料被覆蓋, 資料就遺失了, 而memmove會改成從最後一個byte開始
逆著搬,這樣資料就不會遺失了.
--
Do not depend on others without effort...
當我年輕時,請教別人問題時常聽到上面那句話. 當時心裏偶而會有些小小抱怨.
當時間過去,我偶而會想到上面那句話, 心中十分感謝當初告訴我那句話的人.
當發現問題時,最有價值的不是問題的答案,
而是找到解決的方向,並在努力的過程裡具備解決問題的能力.
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 203.73.236.108
推 justdemon:倒著搬 會不會有prefetch錯的問題? 或是cache miss?? 07/11 15:28
→ justdemon:小弟在這方面不是很清楚 有錯請指正 07/11 15:29
→ charleshu:當然會, 但是正著搬會錯, 只能倒著搬了. 07/11 17:07
→ softwind:prefetch是什麼定義? and cache miss也不一定吧 07/11 17:17
→ softwind:就算是alignment, compiler也會幫你對齊好 07/11 17:17