memcpy vs memmove

memcpymemmove 都可用于复制一段内存。

它们之间的区别很简单:

  • memmove 更安全:当源内存块和目标内存块存在重叠区域时,memcpy 的行为是未定义的。它可能崩溃或产生错误数据。而且在debug 和 release 模式下的表现各不相同。

  • memcpy 更快。

这是两种不同编程思想的实现。一种更注重安全, 一种更注重效率。

下面是两个方法可能的实现方式.

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
void memmove(void *dest, void *src, size_t n)
{
// Typecast src and dest addresses to (char *)
char *csrc = (char *)src;
char *cdest = (char *)dest;

// Create a temporary array to hold data of src
char *temp = new char[n];

// Copy data from csrc[] to temp[]
for (int i=0; i<n; i++)
temp[i] = csrc[i];

// Copy data from temp[] to cdest[]
for (int i=0; i<n; i++)
cdest[i] = temp[i];

delete [] temp;
}

void memcpy(void *dest, void *src, size_t n)
{
// Typecast src and dest addresses to (char *)
char *csrc = (char *)src;
char *cdest = (char *)dest;

// Copy contents of src[] to dest[]
for (int i=0; i<n; i++)
cdest[i] = csrc[i];
}

在编程的时候,应该更多地考虑使用 memmove 而不是 memcpy