这里memcpy与memmove函数的模拟实现,需要用到空指针来传递参数,之后强制类型转换为char型,用size_t这个宏接受偏移量进行偏移,模拟实现如下:
memcpy函数:
void* my_memcpy(void*dst,const void*src ,size_t count) { assert(dst); assert(src); void* ret = dst; while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (char*)src + 1; } return ret; }
memmove函数:
memmve函数是为了避免memcpy函数出现的内存重叠(上篇提到过),而开发的新函数,思想就是,如果有内存重叠的情况,那我们从后向前拷贝,如果没有,就如memcpy一样,从前向后拷贝,实现代码如下:
void* my_memmove(void*dst, const void*src, size_t count) { assert(dst); assert(src); void*ret = dst; if ((char*)dst > ((char*)src + count))//判断是否内存重叠 { while (count--) { *((char*)dst + count) = *((char*)src + count); } } else { while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (char*)src + 1; } } return ret; }
进行内存拷贝,比字符串拷贝要多传递一个拷贝偏移量的参数,因为字符串拷贝往往是遇到0就停止拷贝,而内存拷贝不存在此类问题,运用这两类函数需要思考怎样才能高效地让程序运行。
如有不足,希望批评指正。
本文出自 “pawnsir的IT之路” 博客,请务必保留此出处http://10743407.blog.51cto.com/10733407/1714495
原文地址:http://10743407.blog.51cto.com/10733407/1714495