现在的位置: 首页 > 综合 > 正文

memcpy memmove区别和实现

2018年02月24日 ⁄ 综合 ⁄ 共 773字 ⁄ 字号 评论关闭

memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中。

但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销。

memmove的处理措施:

(1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝

(2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝

(3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝

-- memcpy实现

1
2
3
4
5
6
7
8
void*
memcpy(void*
dest,
const void*
src,
size_t n)
{
    char*     
d = (
char*)
dest;
    const char
s = (
const char*)
src;
    while(n-–)
       *d++
= *s++;
    return dest;
}

 

-- memmove实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
void*
memmove(void*
dest,
const void*
src,
size_t n)
{
    char*    
d  = (
char*)
dest;
    const char
s = (
const char*)
src;
  
    if (s>d)
    {
         //
start at beginning of s
         while (n--)
            *d++
= *s++;
    }
    else if (s<d)
    {
        //
start at end of s
        d
= d+n-1;
        s
= s+n-1;
  
        while (n--)
           *d--
= *s--;
    }
    return dest;
}

抱歉!评论已关闭.