看板 C_and_CPP 關於我們 聯絡資訊
※ 引述《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