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

在memcpy中对齐源地址和目标地址

发布时间:2020-12-16 06:51:03 所属栏目:百科 来源:网络整理
导读:我想写一个memcpy代码,它逐字逐句地复制,而不是逐字节,以提高速度. (虽然我需要为最后或几个字节做一些逐字节复制).所以我希望我的源和目标地址正确对齐. 我在glibc中看到了memcpy的实现 https://fossies.org/dox/glibc-2.22/string_2memcpy_8c_source.html
我想写一个memcpy代码,它逐字逐句地复制,而不是逐字节,以提高速度. (虽然我需要为最后或几个字节做一些逐字节复制).所以我希望我的源和目标地址正确对齐.
我在glibc中看到了memcpy的实现
https://fossies.org/dox/glibc-2.22/string_2memcpy_8c_source.html
它只对目标地址进行对齐.但即使源地址没有正确对齐,也会导致总线错误(考虑在我的cpu中启用了对齐检查)我不确定如何使源和目标都正确对齐.因为如果我尝试通过逐字节复制几个字节来对齐源,它也会更改目标地址,因此首先正确对齐的目标地址现在可能无法正确对齐.
那么有没有办法对齐两者?请帮我.

void  memcpy(void  *dst,void  *src,int  size)
{
   if(size >= 8)
   {
     while(size/8) /* code will give sigbus error if src = 0x10003 and dst = 0x100000 */ 
     {
       *((double*)dst)++  =  *((double*)src)++; 
        size  =  size  -  8;
     }
   }

   while(size--)
   {
     *((char*)dst)++  =  *((char*)src)++;
   }
}

解决方法

…所以首先正确对齐的目标地址现在可能无法正确对齐.那么有没有办法调整两者?

我发现这篇关于memcpy优化的文章,我相信它会讨论你想要做的事情…(参见下面的代码示例链接)

modified-GNU算法:

void * memcpy(void * dst,void const * src,size_t len)
{
    long * plDst = (long *) dst;
    long const * plSrc = (long const *) src;

    if (!(src & 0xFFFFFFFC) && !(dst & 0xFFFFFFFC))
    {
        while (len >= 4)
    {
            *plDst++ = *plSrc++;
            len -= 4;
        }
    }

    char * pcDst = (char *) plDst;
    char const * pcDst = (char const *) plSrc;

    while (len--)
    {
        *pcDst++ = *pcSrc++;
    }

    return (dst);
}

修改的GNU算法的This变体使用计算来调整地址未对准.

(编辑:李大同)

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

    推荐文章
      热点阅读