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

标签 c alignment memcpy

我想编写一个 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 optimization 上找到这篇文章我相信这会详细讨论您要尝试做的事情...

修改后的 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);
} 

关于c - 在 memcpy 中对齐源地址和目标地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35235122/

相关文章:

c - 如果我们使用 memcpy 将更多数据从源复制到目标,会发生什么?

c++ - 使用 memcpy 复制 n 个字符

c - 在 C 中,memcpy 如何处理有符号整数参数?

c++ - 对角展平矩阵的邻域索引计算

css - 如何让按钮文本在 IE 中顶部对齐?

google-chrome - 社交图标的 CSS 对齐 - Chrome/Safari 特定

html - 如何让社交媒体图标在页脚中对齐?

c - 在实际预制卸载之前有没有办法到 "try umount"?

c - scanf 的返回值和输入验证

c - "12345"+ 2 在 C 中做什么?