四个拷贝函数的分析与实现
作者:网络转载 发布时间:[ 2016/10/8 10:47:17 ] 推荐标签:拷贝函数 .NET
什么时候会发生内存重叠呢?
满足 :
1:src<dst<=src+n会发生重叠,需要反序拷贝。
2:当src>dst或者dst<src+n则不会发生内存重叠,此时 正序拷贝/反序拷贝皆可。
所以可以进一步简化为:
1:src>dst正序拷贝
2:src<dst反序拷贝
3:src=dst不拷贝
【上面提供了两种方式,本文我们简单点,将会采用第二种方式进行代码实现。】
下面是memmove的真正介绍了。
/*************************************************/
4.memmove函数
/*************************************************/
1原型:
void *memmove( void* dest, const void* src, size_t n );
其中:n为指定的拷贝的字节长度。
2定义
memmove用于从src拷贝n个字节到dest,如果目标区域和源区域有重叠的话,memmove能够保证源串在被覆盖之前将重叠区域的字节拷贝到目标区域中。但复制后src内容会被更改。但是当目标区域与源区域没有重叠则和memcpy函数功能相同。
3拷贝终止条件:
已经复制了n个字节
4代码实现
void* mymemmove(void *dst,const void *src,unsigned int n)
{
assert(dst!=NULL&&src!=NULL);
char* pdst=(char*)dst;
const char* psrc=(const char*)src;
if(pdst<psrc)//正序
{
while(n--)
{
*pdst++=*psrc++;
}
}
else if(pdst>psrc)//反序
{
psrc=psrc+n-1;//边界要考虑好。
pdst=pdst+n-1;
while(n--)
{
*pdst--=*psrc--;
}
}
return dst;
}
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。

sales@spasvo.com