memcpy内存拷贝的改进与优化

本文介绍了改进memcpy函数的方法,包括处理非重叠和重叠缓冲区的情况,以实现更高效的内存复制。通过判断源地址和目标地址之间的关系,优化了复制过程,特别是在存在重叠区域时,采取了不同的复制策略。

原版:

void *memcpy( void *dest, const void *src, size_t count ) { ASSERT((dest != NULL)&&(src != NULL)); char *temp_dest = (char *)dest; char *temp_src = (char *)src; while(count--) // 不对是否存在重叠区域进行判断 { *temp_dest++ = *temp_src++; } return dest; }

改进一:

void* memcpy(void* dest, void* source, size_t count) { void* ret = dest; if (dest <= source || dest >= (source + count)) { //Non-Overlapping Buffers //copy from lower addresses to higher addresses while (count --) *dest++ = *source++; } else { //Overlapping Buffers //copy from higher addresses to lower addresses dest += count - 1; source += count - 1; while (count--) *dest-- = *source--;l } return ret; }


改进二:

void memcpy(void* dest, const void* src, size_t n) { assert((((uintptr_t) dest | (uintptr_t) src | n) & 0x03) == 0); uint32_t* d = (uint32_t*) dest; const uint32_t* s = (uint32_t*) src; n /= sizeof(uint32_t); if (d < s) { /* copy forward */ while (n--) { *d++ = *s++; } } else { /* copy backward */ d += n; s += n; while (n--) { *--d = *--s; } } }






转载于:https://www.cnblogs.com/springside4/archive/2012/01/01/2481578.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值