C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了在memcpy中对齐源地址和目标地址大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
我想写@L_628_0@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优化的文章,我相信它会讨论你想要做的事情…(参见下面的代码示例链接)

@H_821_9@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变体使用计算来调整地址未对准.

大佬总结

以上是大佬教程为你收集整理的在memcpy中对齐源地址和目标地址全部内容,希望文章能够帮你解决在memcpy中对齐源地址和目标地址所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。