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

Pra*_*een 5 c alignment memcpy

我想编写一个 memcpy 代码,它逐字复制而不是逐字节复制以提高速度。(尽管我需要对最后或几个字节进行一些字节复制)。所以我希望我的源地址和目标地址正确对齐。我在 glibc https://fossies.org/dox/glibc-2.22/string_2memcpy_8c_source.html中看到了 memcpy 的实现, 它仅针对目标地址进行对齐。但即使源地址未正确对齐,也会导致总线错误(考虑在我的 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)++;
   }
}
Run Code Online (Sandbox Code Playgroud)

ryy*_*ker 1

...所以最初正确对齐的目标地址现在可能无法正确对齐。那么有没有办法让两者对齐呢?

我发现这篇关于memcpy 优化的文章我相信它详细讨论了您想要做的事情......

修改后的 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);
} 
Run Code Online (Sandbox Code Playgroud)