memcpy与memmove区别和实现

来源:互联网 发布:python3写网络爬虫 编辑:程序博客网 时间:2024/04/30 15:48

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

参考链接

memcpy memmove区别和实现
memmove 和 memcpy的区别
C/C++ memmove与memcpy的区别及实现
linux内核中memcpy和memmove函数的区别和实现

原创粉丝点击