博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
memcpy memmove区别和实现
阅读量:7114 次
发布时间:2019-06-28

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

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

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

memmove的处理措施:

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

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

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

-- memcpy实现

void* memcpy(void* dest, const void* src, size_t n)  {     char*      d = (char*) dest;     const char*  s = (const char*) src;     while(n-–)         *d++ = *s++;     return dest; }

 

-- memmove实现

void* memmove(void* dest, const void* src, size_t n) {     char*     d  = (char*) dest;     const char*  s = (const char*) src;        if (s>d)      {          // start at beginning of s          while (n--)             *d++ = *s++;     }     else if (s

示意图:

(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

 

转载地址:http://myghl.baihongyu.com/

你可能感兴趣的文章
IOS-面试题
查看>>
hdu 2055 An easy problem (java)
查看>>
HTML5本地存储——Web SQL Database
查看>>
JSON 之JAVA 解析
查看>>
MVC5网站开发之一 总体概述
查看>>
Java并发编程:线程和进程的创建(转)
查看>>
【转】如何利用logrotate工具自动切分滚动中的日志文件
查看>>
视频摘要视频浓缩
查看>>
wow.js使用方法
查看>>
ContentPlaceHolderID属性
查看>>
源码安装Memcached服务器及其2种PHP客户端
查看>>
大数据架构:flume-ng+Kafka+Storm+HDFS 实时系统组合
查看>>
QT 对话框一
查看>>
mysql加密函数
查看>>
JedisConnectionException: Unexpected end of stream.
查看>>
openstack中彻底删除计算节点的操作记录
查看>>
统一回复《怎么学JavaScript?》
查看>>
[AngularJS] Using an AngularJS directive to hide the keyboard on submit
查看>>
博客迁址通知
查看>>
Git查看、删除、重命名远程分支和tag(转)
查看>>