16,471
社区成员
发帖
与我相关
我的任务
分享
void *memcpy1(void *dst, const void *src, size_t size)
{
void *ret = dst;
while (size--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return ret;
}
void *memcpy2(void *dst, const void *src, size_t size)
{
void *ret = dst;
size_t block = size / 4;
while (block--)
{
*(int *)dst = *(int *)src;
dst = (int *)dst + 1;
src = (int *)src + 1;
}
size_t mod = size % 4;
if (mod)
{
while (mod--)
{
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
}
return ret;
}
void *memcpy_optimized(void *dst, const void *src, size_t sz)
{
void *r = dst;
//先进行uint64_t长度的拷贝,一般而言,内存地址都是对齐的,
size_t n = sz & ~(sizeof(uint64_t) - 1);
uint64_t *src_u64 = (uint64_t *) src;
uint64_t *dst_u64 = (uint64_t *) dst;
while (n)
{
*dst_u64++ = *src_u64++;
n -= sizeof(uint64_t);
}
//将没有非8字节字长取整的部分copy
n = sz & (sizeof(uint64_t) - 1);
byte *src_u8 = (byte *) src;
byte *dst_u8 = (byte *) dst;
while (n-- )
{
(*dst_u8++ = *src_u8++);
}
return r;
return NULL;
}