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

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

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

但当源内存和目标内存存在重叠时,memcpy不保证拷贝结果的正确,而memmove能正确地实施拷贝,但这也增加了一点点开销。

memcpy的实现:

1. 当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
2. 当源内存的首地址不等于目标内存的首地址时,实行正向拷贝

memmove的实现:

1. 当源内存的首地址等于目标内存的首地址时,不进行任何拷贝
2. 当源内存的首地址大于目标内存的首地址时,实行正向拷贝
3. 当源内存的首地址小于目标内存的首地址时,实行反向拷贝

这里写图片描述

当拷贝的区域重叠时,若源内存的首地址大于目标内存的首地址,则使用memcpymemmove拷贝重叠的区域都不会出现问题,内容均可以正确的被拷贝;若源内存的首地址小于目标内存的首地址,则使用memcpy时,源内存中末尾字节内容会被覆盖,导致最后拷贝到目标内存的是已经被覆盖的内容。

551 #ifndef __HAVE_ARCH_MEMCPY552 /**553  * memcpy - Copy one area of memory to another554  * @dest: Where to copy to555  * @src: Where to copy from556  * @count: The size of the area.557  *558  * You should not use this function to access IO space, use memcpy_toio()559  * or memcpy_fromio() instead.560  */561 void *memcpy(void *dest, const void *src, size_t count)562 {563         char *tmp = dest;564         const char *s = src;565566         while (count--)567                 *tmp++ = *s++;568         return dest;569 }570 EXPORT_SYMBOL(memcpy);571 #endif572573 #ifndef __HAVE_ARCH_MEMMOVE574 /**575  * memmove - Copy one area of memory to another576  * @dest: Where to copy to577  * @src: Where to copy from578  * @count: The size of the area.579  *580  * Unlike memcpy(), memmove() copes with overlapping areas.581  */582 void *memmove(void *dest, const void *src, size_t count)583 {584         char *tmp;585         const char *s;586587         if (dest <= src) {588                 tmp = dest;589                 s = src;590                 while (count--)591                         *tmp++ = *s++;592         } else {593                 tmp = dest;594                 tmp += count;595                 s = src;596                 s += count;597                 while (count--)598                         *--tmp = *--s;599         }600         return dest;601 }602 EXPORT_SYMBOL(memmove);603 #endif

参考链接

你可能感兴趣的文章
iOS开发者的福利 — — iOS9+Xcode7免越狱免证书直接调试
查看>>
3、JavaWeb学习之基础篇—JSP
查看>>
4、JavaWeb学习之基础篇—Session
查看>>
5、JavaWeb学习之基础篇—标签(自定义&JSTL)
查看>>
8、JavaWEB学习之基础篇—文件上传&下载
查看>>
reRender属性的使用
查看>>
href="javascript:void(0)"
查看>>
h:panelGrid、h:panelGroup标签学习
查看>>
f:facet标签 的用法
查看>>
<h:panelgroup>相当于span元素
查看>>
java中append()的方法
查看>>
必学高级SQL语句
查看>>
经典SQL语句大全
查看>>
Eclipse快捷键 10个最有用的快捷键
查看>>
log日志记录是什么
查看>>
<rich:modelPanel>标签的使用
查看>>
<h:commandLink>和<h:inputLink>的区别
查看>>
<a4j:keeyAlive>的英文介绍
查看>>
关于list对象的转化问题
查看>>
VOPO对象介绍
查看>>