在C中实现优化Memmove



我正在尝试实现我自己的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

这不是你想要的。

最新更新