memmove

一、函数的引出

首先是这个函数在笔试的时候经常会被问到,另一个就是C库实现的一些技巧以及这个函数本身的一些保证。

二、说明

memmove的说明:将src拷贝到dst,其语义等价于首先将源拷贝到一个和目的、源都不搭的空间中,然后将这个中间空间的内存拷贝到目的空间。

这里最重要的就是当源和目的之间有重合的时候,memmove保证目的是源的一个完整的重复,这一点在源和目的在长度范围内有重合的时候就比较有意义。

三、GLIBC的实现

rettype
memmove (a1, a2, len)
     a1const void *a1;
     a2const void *a2;
     size_t len;
{
  unsigned long int dstp = (long int) dest;
  unsigned long int srcp = (long int) src;

  /* This test makes the forward copying code be used whenever possible.
     Reduces the working set.  */
  if (dstp - srcp >= len) /* *Unsigned* compare!
  */ 这里非常诡异而巧妙,是两个无符号数的比较
    {
      /* Copy from the beginning to the end.  */

      /* If there not too few bytes to copy, use word copy.  */
      if (len >= OP_T_THRES)
 {
   /* Copy just a few bytes to make DSTP aligned.  */
   len -= (-dstp) % OPSIZ;
   BYTE_COPY_FWD (dstp, srcp, (-dstp) % OPSIZ);

   /* Copy whole pages from SRCP to DSTP by virtual address
      manipulation, as much as possible.  */

   PAGE_COPY_FWD_MAYBE (dstp, srcp, len, len);

   /* Copy from SRCP to DSTP taking advantage of the known
      alignment of DSTP.  Number of bytes remaining is put
      in the third argument, i.e. in LEN.  This number may
      vary from machine to machine.  */

   WORD_COPY_FWD (dstp, srcp, len, len);

   /* Fall out and copy the tail.  */
 }

      /* There are just a few bytes to copy.  Use byte memory operations.  */
      BYTE_COPY_FWD (dstp, srcp, len);
    }
  else
    {
      /* Copy from the end to the beginning.  */
      srcp += len;
      dstp += len;

      /* If there not too few bytes to copy, use word copy.  */
      if (len >= OP_T_THRES)
 {
   /* Copy just a few bytes to make DSTP aligned.  */
   len -= dstp % OPSIZ;
   BYTE_COPY_BWD (dstp, srcp, dstp % OPSIZ);

   /* Copy from SRCP to DSTP taking advantage of the known
      alignment of DSTP.  Number of bytes remaining is put
      in the third argument, i.e. in LEN.  This number may
      vary from machine to machine.  */

   WORD_COPY_BWD (dstp, srcp, len, len);

   /* Fall out and copy the tail.  */
 }

      /* There are just a few bytes to copy.  Use byte memory operations.  */
      BYTE_COPY_BWD (dstp, srcp, len);
    }

  RETURN (dest);
}

posted on   tsecer  阅读(5270)  评论(0编辑  收藏  举报

编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示