memmove和memcpy

在阅读<<STL源码剖析>>的过程中,看到关于内存处理工具的问题,其中的uninitialized_copy使用了memmove函数,但是并没有详细解释,这里记录一下。

memmove和memcpy都是用于内存拷贝的函数,并不是像函数名字一样,一个是复制,一个是移动。它们声明在<memory>头文件中。


memcpy是把源地址(const void *型)指向的对象中的n个字符,拷贝到目的地址(void *)所指向的对象中,返回指向结果对象的指针。  


在msdn中声明如下:

void *memcpy( void *dest, const void *src, size_tcount );


代码可以实现如下:

/**
 * memcpy - Copy one area of memory to another
 * @dest: Where to copy to
 * @src: Where to copy from
 * @count: The size of the area.
 *
 * You should not use this function to access IO space, use memcpy_toio()
 * or memcpy_fromio() instead.
 */
void  * memcpy ( void  * dest, const   void  *src, size_t  count)
{
     char  *tmp = ( char  *) dest, *s = ( char  *) src;
     while  (count--)
        *tmp++ = *s++;
     return  dest;
}</span>

实现原理如下图,只是简单的从源地址到目标地址的顺序拷贝。

但是这里可能会出现问题,如果目标地址和源地址的内存出现重合,其中的内容将被覆盖,具体情况如下:


   memmove也是把源地址指向的对象中的n个字符拷贝到目的地址所指向的对象中,返回指向结果对象的指针。但是函数对这种问题进行了判定,如果出现重合,就逆向的拷贝,并不是像自己开始想的一样,使用一个额外的缓冲的数组。

   代码如下:这里使用的是linux版本。


  1. /* Normally compiler builtins are used, but sometimes the compiler calls out
  2.    of line code. Based on asm-i386/string.h.
  3.  */
  4. #define _STRING_C
  5. #include <linux/string.h>
  6. #undef memmove
  7. void  *memmove ( void  * dest, const   void  *src, size_t  count)
  8. {
  9.      if  (dest < src) { 
  10.         __inline_memcpy(dest,src,count);
  11.     }  else  {
  12.          char  *p = ( char  *) dest + count;
  13.          char  *s = ( char  *) src + count;
  14.          while  (count--)
  15.             *--p = *--s;
  16.     }
  17.      return  dest;
  18. }
  19. 紫色的部分实现了代码的复用,红色部分,通过一个简单的反向的拷贝,解决了重叠问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值