memmove,memcpy 函式的分別實現

2021-06-09 06:58:56 字數 2065 閱讀 5273

memmove,memcpy 函式的分別實現;這兩個函式不以'\0'結束符來區分字元,換句話說並不將引數當作字元來看待。memcpy對重疊區的複製會出現問題,但memove不會。

以下**於 linux c程式設計一站式學習

#include

//#include

void *memmove(void *dest, const void *src, size_t n);

void *memcpy(void *dest, const void *src, size_t n);

int main (void)

void *memmove(void *dest, const void *src, size_t n)

void *memcpy(void *dest, const void *src, size_t n)

結果:memmove(buf + 1, buf, 13) = hello world

memcpy(buf + 1, buf, 13) = hhello wwrldd

buf=hhhello wwrldd

在32位的x86平台上,每次拷貝1個位元組需要一條指令,每次拷貝4個位元組也只需要一條指令,memcpy函式的實現盡可能4個位元組4個位元組地拷貝,因而得到上述結果

c99的restrict關鍵字

我們來看乙個跟memcpy/memmove類似的問題。下面的函式將兩個陣列中對應的元素相加,結果儲存在第三個陣列中。

void vector_add(const double *x, const double *y, double *result)

如果這個函式要在多處理器的計算機上執行,編譯器可以做這樣的優化:把這乙個迴圈拆成兩個迴圈,乙個處理器計算i值從0到31的迴圈,另乙個處理器計算i值從32到63的迴圈,這樣兩個處理器可以同時工作,使計算時間縮短一半。但是這樣的編譯優化能保證得出正確結果嗎?假如result和x所指的記憶體區間是重疊的,result[0]其實是x[1],result[i]其實是x[i+1],這兩個處理器就不能各幹各的事情了,因為第二個處理器的工作依賴於第乙個處理器的最終計算結果,這種情況下編譯優化的結果是錯的。這樣看來編譯器是不敢隨便做優化了,那麼多處理器提供的並行性就無法利用,豈不可惜?為此,c99引入restrict關鍵字,如果程式設計師把上面的函式宣告為void vector_add(const double *restrict x, const double *restrict y, double *restrict result),就是告訴編譯器可以放心地對這個函式做優化,程式設計師自己會保證這些指標所指的記憶體區間互不重疊。

由於restrict是c99引入的新關鍵字,目前linux的man page還沒有更新,所以都沒有restrict關鍵字,本書的函式原型都取自man page,所以也都沒有restrict關鍵字。但在c99標準中庫函式的原型都在必要的地方加了restrict關鍵字,在c99中memcpy的原型是void *memcpy(void * restrict s1, const void * restrict s2, size_t n);,就是告訴呼叫者,這個函式的實現可能會做些優化,編譯器也可能會做些優化,傳進來的指標不允許指向重疊的記憶體區間,否則結果可能是錯的,而memmove的原型是void *memmove(void *s1, const void *s2, size_t n);,沒有restrict關鍵字,說明傳給這個函式的指標允許指向重疊的記憶體區間。在restrict關鍵字出現之前都是用自然語言描述哪些函式的引數不允許指向重疊的記憶體區間,例如在c89標準的庫函式一章開頭提到,本章描述的所有函式,除非特別說明,都不應該接收兩個指標引數指向重疊的記憶體區間,例如呼叫sprintf時傳進來的格式化字串和結果字串的首位址相同,諸如此類的呼叫都是非法的。本書也遵循這一慣例,除非像memmove這樣特別說明之外,都表示「不允許」。

memcpy的效率會比memmove高一些,如果還不明白的話可以看一些兩者的實現:

void *memmove(void *dest, const void *source, size_t count)

else

return dest;

} void *memcpy(void *dest, const void *source, size_t count)

函式基礎 匿名函式,函式,箭頭函式,立即執行函式

doctype html html lang en head meta charset utf 8 meta name viewport content width device width,initial scale 1.0 title document title head body body ...

函式 常見函式

def fib n if n 1 return 1if n 2 return 1return fib n 1 fib n 2 def hannuo n,a,b,c n 表示有n個盤子 a 代表第乙個塔,開始的塔 b 代表第二個塔,過渡塔 c 代表第三個塔,目標塔 d.在 中n 2,這個分支可以不要,...

Lua 函式 函式

在lua中,函式是一種對語句和表示式進行抽象的主要機制。函式既可以完成某項特定的任務,也可以只做一些計算並返回結果。lua具有一項非常於總不同的特徵,允許函式返回多個結果 s,e string.find hello lua users lua print s,e 7 9 以lua編寫的函式同樣可以返...