C++中memcpy和memmove

  • Post author:
  • Post category:其他


二者都是内存拷贝

memcpy内存拷贝,没有问题;memmove,内存移动?错,如果这样理解的话,那么这篇文章你就必须要好好看看了,memmove还是内存拷贝。那么既然

memcpy和memmove二者都是内存拷贝

,那二者究竟有什么区别呢?

区别

memcpy

实现代码,注意以下几点:

1.确定函数原型;

2.判断参数合法性;

3.逻辑实现(考虑各种情况,统称逻辑实现);

4.错误处理。

 1 void *mymemcpy(void *dest, const void *src, size_t count)
 2  {
 3      assert(dest != NULL || src != NULL);
 4      
 5      char *tmp = (char *)dest;
 6      char *p = (char *)src;
 7   
 8      while (count--)
 9      {
10          *tmp++ = *p++;
11      }
12      return dest;
13  }

这样下去,上面的代码会运行的很好,如果出现下面的情况呢?

memmove

 1 void *mymemmove(void *dest, const void *src, size_t count)
 2  {
 3      assert(dest != NULL || src != NULL)
 4   
 5      if (dst < src)
 6      {
 7          char *p = (char *)dest;
 8          char *q = (char *)src;
 9          while (count--)
10          {
11              *p++ = *q++;
12          }
13      }
14      else
15      {
16          char *p = (char *)dest + count;
17          char *q = (char *)src + count;
18          while (count--)
19          {
20              *--p = *--q;  //注意先--
21          }
22      }
23   
24      return dest;
25  }

实现源码中的确能看出一些猫腻,当出现了src和dest的内存有重合的时机时,memmove的处理规则是从后往前进行copy。当然了,重合的问题,需要考虑的以下两种场合。

如图所示,当出现(1)对应的情况时,就需要先从src的头部开始复制;也就是memmove源码中的if分支,这部分源码和memcpy的实现是一致的;当出现(2)对应的情况时,就需要先从src的尾部开始复制,防止出现了覆盖现象。这就是memmove比memcpy多的一个考虑点,所以说,在实际使用时,使用memmove是比memcpy更安全的。

转载于:https://www.cnblogs.com/raichen/p/5802921.html