memcpy vs memmove

【本文连接】

http://www.cnblogs.com/hellogiser/p/memcpy_vs_memmove.html

【分析】

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

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

memmove的处理措施:

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

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

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

示意图:

(1)内存低端 <-----s-----> <-----d-----> 内存高端 start at end of s(2)内存低端 <-----s--<==>--d----->      内存高端 start at end of s(3)内存低端 <-----sd----->              内存高端 do nothing(4)内存低端 <-----d--<==>--s----->      内存高端 start at beginning of s(5)内存低端 <-----d-----> <-----s-----> 内存高端 start at beginning of s

【代码】

C++ Code


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
 
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
using namespace std;

/*
 * not check overlapping
 * optimization: copy by word(4 or 8 bytes) instead of by 1 byte
 * */
void* my_memcpy(void* dest,const void* src,size_t count)
{
    if(src == NULL || dest == NULL)
        return NULL;
    char* d = (char*)dest;
    const char* s = (const char*)src;
    while(count--)
    {
        *d ++ = *s ++;
    }
    return dest;
}

/*
 * check overlapping
 * optimization: copy by word(4 or 8 bytes) instead of by 1 byte
 * */
/*
 * d == s
 * d <s, copying from the beginning
 * d >s, copying from the end
 * */
void* my_memmove(void* dest,const void* src,size_t count)
{
    if(src == NULL || dest == NULL)
        return NULL;
    char* d = (char*)dest;
    const char* s = (const char*)src;
    if(d<s)
    {
        //copy from the beginning
        while(count--)
        {
            *d++ = *s++;
        }
    }
    else if(d>s)
    {
        //copy from the end
        d = d+count-1;
        s = s+count-1;
        while(count--)
        {
            *d-- = *s--;
        }
    }
    else 
    {
        // do nothing
    }
    return dest;
}

void test_case()
{
    char dest[100];
    const char *src = "hello";
    my_memcpy(dest,src,strlen(src)+1);
    printf("%s\n",dest);
}

void test_case2()
{
    char dest[] = "memmove can be very userful...";
    my_memcpy(dest+20,dest+8,3);
    printf("%s\n",dest);
}

int main()
{
    test_case();
    test_case2();
    return 0;
}

【如何优化】

通常memcpy和memmove是按照字节byte拷贝,可以优化为按照机器字长word(32位机器4字节,64位机器8字节)进行拷贝。因为对一个word的操作cpu都可以在一个指令周期内完成,这样能够提高拷贝的效率。

【链接】

http://www.cnblogs.com/kekec/archive/2011/07/22/2114107.html

http://www.cplusplus.com/reference/cstring/memmove/

http://www.cplusplus.com/reference/cstring/memcpy/

时间: 2024-12-09 15:32:06

memcpy vs memmove的相关文章

实现memcpy和memmove函数

题目: 自己定义一个函数,实现my_memcpy和my_memmove函数. 题目分析: memcpy函数主要实现的是内存的拷贝,函数接受任意类型的参数,并且有拷贝个数的限制,函数与strcpy函数在功能上有相似点,也有不同点.memmove函数在memcpy函数的基础上解决了内存重叠的问题.下面是memcpy和memmove函数的实现: my_memmove函数: #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include &l

memcpy 与 memmove

memcpy:C和C++当中使用的内存拷贝函数,memcpy函数的功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 函数原型 void* memcpy(void* dest, const void* src, size_t count) 函数返回指向dest的指针: mencpy与memmove的区别:根据源代码编写自己的Mencpy 与Memmove #include <iostream> using namespace std; #incl

memcpy、memmove、memset及strcpy函数实现和理解

memcpy.memmove.memset及strcpy函数实现和理解 关于memcpy memcpy是C和C++ 中的内存拷贝函数,在C中所需的头文件是#include<string.h>, 在C++中需要包含的头文件是#include其函数原型如下: void *memcpy(void *dest, const void *src, size_t n); 其功能是从源src所指的内存地址的起始位置开始拷贝n个字节到目标dest所指的内存地址的起始位置中. 库函数中的memcpy不能处理sr

C语言实现memcpy和memmove

0.两者比较: memmove用于从src拷贝count个字符到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中.但复制后src内容会被更改.但是当目标区域与源区域没有重叠则和memcpy函数功能相同. memmove在copy两个有重叠区域的内存时可以保证copy的正确,而memcopy就不行了,但memcopy比memmove的速度要快一些,如:char s[] = "1234567890";char* p1 = s;

memcpy、memmove、memset、memchr、memcmp、strstr详解

第一部分 综述 memcpy.memmove.memset.memchr.memcmp都是C语言中的库函数,在头文件string.h中.memcpy和memmove的作用是拷贝一定长度的内存的内容,memset用于缓冲区的填充工作,memchr用于字符的查找工作,memcmp用于比较内存中缓冲区的大小. 第二部分  介绍 1.memcpy和memmove memcpy()--拷贝内存内容 表头文件:#include<string.h>或#include<cstring> 定义函数:

C/C++之Memcpy and memmove

memcpy与memmove的目的都是将N个字节的源内存地址的内容拷贝到目标内存地址中. 但当源内存和目标内存存在重叠时,memcpy会出现错误,而memmove能正确地实施拷贝,但这也增加了一点点开销. memmove的处理措施: (1)当源内存的首地址等于目标内存的首地址时,不进行任何拷贝 (2)当源内存的首地址大于目标内存的首地址时,实行正向拷贝 (3)当源内存的首地址小于目标内存的首地址时,实行反向拷贝 -- memcpy实现 1 void* memcpy(void* dest, con

memcpy和memmove的区别

函数memcpy()   从source  指向的区域向dest指向的区域复制count个字符,如果两数组重叠,不定义该函数的行为.     而memmove(),如果两函数重叠,赋值仍正确进行. memcpy函数假设要复制的内存区域不存在重叠,如果你能确保你进行复制操作的的内存区域没有任何重叠,可以直接用memcpy:     如果你不能保证是否有重叠,为了确保复制的正确性,你必须用memmove. memcpy和memmove的区别

关于memcpy和memmove的一点说明

今天看到书上降到memcpy和memmove的区别才突然 发现原来两者之间有如此区别,以前只知道这两个函数是 实现同样的功能,没有接触到其不同. memcpy和memmove在MSDN的定义如下: 从两者的声明来看的确没有区别,我们来看这样一个例子 当我们需要将char* src="abcde"这个字符串全部copy到dest中 然而src与dest在内存中大概是这样存在的: 内存地址   低------>高   1 src dest 2 1 2 3 4 5 6 3 [ a ][

[整理]内存重叠之memcpy、memmove

函数原型: void *memcpy( void *dest, const void *src, size_t count ); void *memmove( void* dest, const void* src, size_t count );  1.memcpy和memmove相同点都是用于从src拷贝count个字节到dest. 2.memcpy和memmove区别如果目标区域和源区域有重叠的话:memcpy不能够确保源串所在重叠区域在拷贝之前被覆盖.memmove能够保证源串在被覆盖之