memcpy与memmove区别和实现

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

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

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

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

这里写图片描述

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

551 #ifndef __HAVE_ARCH_MEMCPY
552 /**
553  * memcpy - Copy one area of memory to another
554  * @dest: Where to copy to
555  * @src: Where to copy from
556  * @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;
565
566         while (count--)
567                 *tmp++ = *s++;
568         return dest;
569 }
570 EXPORT_SYMBOL(memcpy);
571 #endif
572
573 #ifndef __HAVE_ARCH_MEMMOVE
574 /**
575  * memmove - Copy one area of memory to another
576  * @dest: Where to copy to
577  * @src: Where to copy from
578  * @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;
586
587         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函数的区别和实现

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值