在memcpy中对齐源地址和目标地址
发布时间:2020-12-16 06:51:03 所属栏目:百科 来源:网络整理
导读:我想写一个memcpy代码,它逐字逐句地复制,而不是逐字节,以提高速度. (虽然我需要为最后或几个字节做一些逐字节复制).所以我希望我的源和目标地址正确对齐. 我在glibc中看到了memcpy的实现 https://fossies.org/dox/glibc-2.22/string_2memcpy_8c_source.html
我想写一个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优化的文章,我相信它会讨论你想要做的事情…(参见下面的代码示例链接) 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变体使用计算来调整地址未对准. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |