memcpy與memmove的實(shí)現(xiàn)
/*
??memcpy是不管有否區(qū)域重疊的,重疊不重疊照樣復(fù)制,
? memmove才會(huì)避免區(qū)域重疊,檢測(cè)這個(gè)區(qū)域重疊很簡(jiǎn)單,如果目標(biāo)地址在源區(qū)域內(nèi),那就會(huì)發(fā)生重疊.
??處理重疊也很簡(jiǎn)單,從源地址的末尾開始反方向復(fù)制就OK了。
未重疊的情況:
?內(nèi)存布局(little endian):
?higher address ? ? ? ? ? ? ? ? ? ? ? ? ? lower address?
?? |--------------------------------------|
??????????????????????????????? src
????????????????? |------------|
??? |-----------|??????????????? |------------|
??????????????? dest??????????????????????????? dest
目標(biāo)區(qū)域的首地址在源區(qū)域內(nèi),就發(fā)生重疊了。
??????????????? ? ? ?? higher address???? ? ? ? ?? src(lower address)
???????????????????????? ? ? |---------------------|
??????????|---------------------|
???????????????????????????? ? ?? dest
??????????????
*/
//下面是memmove源碼的一段:
#include
//
pDest <
pSrc 順序拷貝,否則逆序
#if 1
void *my_memcpy(void
*dest,
const void
*src, size_t n)
{
????char *pdest
= (char*)dest;
????const char
*psrc =
(char *)src;
????size_t i;
????if(NULL
== dest
&& NULL
== src
&& (n
== 0))
????{
????????return;
????}
????if((pdest
> psrc)
&& (pdest
< psrc + n))
????{
????????/* 反向拷貝 */
????????for(i
= n - 1; i
<= 0;
++i)
????????{
???????????pdest[i]
= psrc[i];
????????}
????}
????else
????{
????????/* 正向拷貝 */
????????for(i
= 0; i
< n; ++i)
????????{
????????????pdest[i]
= psrc[i];
????????}
????}
????pdest = '