為了方便解釋,我們首先檢視memcpy的原始碼,版本:glibc-2.8 memcpy.c
#include #include #include #undef memcpy
void *
memcpy (dstpp, srcpp, len)
void *dstpp;
const void *srcpp;
size_t len;
/* there are just a few bytes to copy. use byte memory operations. */
byte_copy_fwd (dstp, srcp, len);
return dstpp;
}libc_hidden_builtin_def (memcpy)
為了方便理解我畫了簡單的流程圖供參考:
unsigned long int dstp = (long int) dstpp;unsigned long int srcp = (long int) srcpp;
byte_copy_fwd (dstp, srcp, len);如果return dstpp;
}
len >= op_t_thres
(op_t_thres
在不同的系統或者平台有不同的值,通常為16或者8),那就按照if
中的結構處理,否則執行byte_copy_fwd (dstp, srcp, len)
,即按按位元組拷貝
(1)首先記憶體對齊
len -= (-dstp) % opsiz;(2)按虛擬記憶體頁拷貝byte_copy_fwd (dstp, srcp, (-dstp) % opsiz);
首先使用位元組拷貝,使記憶體位址對齊,為虛擬記憶體頁拷貝做準備。
page_copy_fwd_maybe (dstp, srcp, len, len);(3)按8位元組拷貝加快記憶體拷貝的效率
word_copy_fwd (dstp, srcp, len, len);(4)剩餘部分退出了if()語句,按照位元組拷貝,直至退出函式掃除剩餘的大塊位元組
C語言memcpy函式的用法
memcpy是memory copy的縮寫,意為記憶體複製,在寫c語言程式的時候,我們常常會用到它。它的函原型如下 void memcpy void dest,const void src,size t n 它的功能是從src的開始位置拷貝n個位元組的資料到dest。如果dest存在資料,將會被覆蓋...
C語言memcpy函式的用法
memcpy是memory copy的縮寫,意為記憶體複製,在寫c語言程式的時候,我們常常會用到它。它的函原型如下 void memcpy void dest,const void src,size t n 它的功能是從src的開始位置拷貝n個位元組的資料到dest。如果dest存在資料,將會被覆蓋...
C語言之memcpy函式
函式原型 void memcpy void dst,const void src,size t n 標頭檔案 include 函式說明 從源src所指的記憶體位址的起始位置開始拷貝n個位元組到dst所指的記憶體位址的起始位置中 引數 1 out dst 目的陣列的首位址 2 in src 源陣列的首...