zoukankan      html  css  js  c++  java
  • C++中memcpy和memmove

    二者都是内存拷贝

    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更安全的。

  • 相关阅读:
    B
    A
    【转】通过身边小事解释机器学习是什么?
    【转】什么是无监督学习?
    机器学习中的监督学习和无监督学习
    经典传染病传播模型
    复杂网络的主要研究内容
    网络科学导论【第一章】读书脑图
    无标度网络模型
    小世界网络模型
  • 原文地址:https://www.cnblogs.com/raichen/p/5802921.html
Copyright © 2011-2022 走看看