我正在尝试实现我自己的memmove函数。我正在尝试优化它,而不是逐字节复制。这是我的实现:
void* my_memmove(void *dest, const void *src, size_t len) {
if((uintptr_t)dest < (uintptr_t)src)
return memcpy(dest,src,len);
long *pdest = (long*)dest +len;
const long *psrc = (const long*)src+len;
if(!((uintptr_t)dest+len & (sizeof(long)-1)) &&
!((uintptr_t)src+len & (sizeof(long)-1))) {
while(len >= sizeof(long)) {
*--pdest = *--psrc;
len-=sizeof(long);
}
}
char *pdest2 = (char*)pdest;
const char *psrc2= (const char*)psrc;
while(len) {
*--pdest2 = *--psrc2;
len--;
}
return dest;
}
关于我如何改进这一点,或者现有代码是否存在一些问题,有什么意见吗?
调用memcpy
的代码中有一个错误。
我像一样更改了你的代码
void* my_memmove(void *dest, const void *src, size_t len) {
if((uintptr_t)dest < (uintptr_t)src)
{
printf("memcpyn");
return memcpy(dest,src,len);
}
printf("my coden");
return NULL;
}
int main()
{
unsigned char a[100] = {0};
my_memmove(&a[0], &a[25], 50); // Overlapping dst and src
return 0;
}
输出:
memcpy
所以你用重叠的区域来调用memcpy
。
另一个错误。。。
你对这条线有什么期望:
long *pdest = (long*)dest +len;
假设dest
是0x1000,并且len
是1。你似乎期望值0x1001
,但试试这个:
int main()
{
size_t len = 1;
long *pdest = (long*)0x1000 +len;
printf("%pn", (void*)pdest);
return 0;
}
我的系统输出:
0x1008
这不是你想要的。