我想编写一个 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/