加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

内存拷贝函数 memcpy

发布时间:2020-12-14 02:40:05 所属栏目:Windows 来源:网络整理
导读:windows下实现: void * __cdecl memcpy( void * dst, const void * src,size_t count){ void *ret= dst; #if defined(_M_MRX000)||defined(_M_ALPHA)||defined(_M_PPC) { extern void RtlMoveMemory( void *, const void * ,size_t count); RtlMoveMemory(d

windows下实现:

void* __cdecl memcpy(void* dst,const void* src,size_t count)
{
    void*ret=dst;
  #if defined(_M_MRX000)||defined(_M_ALPHA)||defined(_M_PPC)
  {
       extern void RtlMoveMemory(void *,const void *,size_t count);
       RtlMoveMemory(dst,src,count);
  }
  #else /*defined(_M_MRX000)||defined(_M_ALPHA)||defined(_M_PPC)*/
  /*
  *copy from lower addresses to higher addresses
  */
  while(count--){
      *(char *)dst = *(char *)src;
      dst = (char *)dst+1;
      src = (char *)src+1;
  }
  #endif  /*defined(_M_MRX000)||defined(_M_ALPHA)||defined(_M_PPC)*/
  return (ret);
}

?

liunx下实现的代码:

void *memcpy(void *to,const void *from,size_t n)
{
   //记录拷贝目的位置,为了返回拷贝内容的首地址
void *xto = to; size_t temp,temp1;  
   //判断拷贝的字节数
if (!n) return xto;
   //
if ((long)to & 1) { char *cto = to; const char *cfrom = from; *cto++ = *cfrom++; to = cto; from = cfrom; n--; } if (n > 2 && (long)to & 2) { short *sto = to; const short *sfrom = from; *sto++ = *sfrom++; to = sto; from = sfrom; n -= 2; } temp = n >> 2; if (temp) { long *lto = to; const long *lfrom = from;   #if defined(CONFIG_M68000) || defined(CONFIG_COLDFIRE) for (; temp; temp--) *lto++ = *lfrom++;   #else asm volatile ( " movel %2,%3n" " andw #7,%3n" " lsrl #3,%2n" " negw %3n" " jmp %%[email?protected](1f,%3:w:2)n" "4: movel %[email?protected]+,%[email?protected]+n" " movel %[email?protected]+,%[email?protected]+n" " movel %[email?protected]+,%[email?protected]+n" " movel %[email?protected]+,%[email?protected]+n" " movel %[email?protected]+,%[email?protected]+n" " movel %[email?protected]+,%[email?protected]+n" " movel %[email?protected]+,%[email?protected]+n" " movel %[email?protected]+,%[email?protected]+n" "1: dbra %2,4bn" " clrw %2n" " subql #1,%2n" " jpl 4b" : "=a" (lfrom),"=a" (lto),"=d" (temp),"=&d" (temp1) : "0" (lfrom),"1" (lto),"2" (temp));   #endif to = lto; from = lfrom;    }   if (n & 2) { short *sto = to; const short *sfrom = from; *sto++ = *sfrom++; to = sto; from = sfrom;   }    if (n & 1) {    char *cto = to;    const char *cfrom = from;    *cto = *cfrom;    } return xto; }

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读