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)
...所以最初正确对齐的目标地址现在可能无法正确对齐。那么有没有办法让两者对齐呢?
我发现这篇关于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)