博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++中memcpy和memmove
阅读量:4697 次
发布时间:2019-06-09

本文共 1354 字,大约阅读时间需要 4 分钟。

二者都是内存拷贝

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      else15      {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

你可能感兴趣的文章
Thinking in Java Reading Note(5.初始化与清理)
查看>>
Visual Studio 2015年预览设置: 辅助安装程序说明
查看>>
洛谷2149 Elaxia的路线(dp+最短路)
查看>>
python开发学习-day03(set集合、collection系列 、深浅拷贝、函数)
查看>>
yii性能调节
查看>>
centos 7.4 + postgresql 10.1 + pg_amqp
查看>>
Throwable、Error、Exception、RuntimeException 区别
查看>>
js对闭包的理解
查看>>
腾讯面试问题
查看>>
自定义标题栏右键菜单
查看>>
Bootstrap概述
查看>>
elementUi源码解析(1)--项目结构篇
查看>>
C#中用DateTime的ParseExact方法解析日期时间(excel中使用系统默认的日期格式)
查看>>
任务二 阅读报告
查看>>
高阶函数
查看>>
W3100SM-S 短信猫代码发送 上
查看>>
【Netty】EventLoop和线程模型
查看>>
打开一个页面,并监听该页面的关闭事件
查看>>
软件保护技术--- 常见保护技巧
查看>>
SQL批量分离工具
查看>>