通常来说,这个函数的实现比较简单
我看了下crt的实现源码,如下:(略去64位机的)
今天,我看到一个面试题上叫实现这个函数,看了下它的参考答案,如下
大家讨论下吧~
我看了下crt的实现源码,如下:(略去64位机的)
- void * __cdecl memcpy (
-
void * dst,
const void * src,
size_t count
)
{
void * ret = dst;
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
return(ret);
}
今天,我看到一个面试题上叫实现这个函数,看了下它的参考答案,如下
- void *MyMemCopy(void *dest,const void *src,size_t count)
-
解决区域重叠问题
比如这种
| src |
| dst | 这个就是memcpy与memmove的区别
数据重叠区的处理!
ctr的memset是不管区域重叠的,使用memmov则考虑区域重叠,更安全写
{
char *pDest=static_cast<char *>(dest);
const char *pSrc=static_cast<const char *>(src);
//注意,这里是关键,为什么要这样比较呢?理由何在?
if( pDest>pSrc && pDest<pSrc+count )
{
for(size_t i=count-1; i<=0; ++i)
{
pDest[i]=pSrc[i];
}
}
else
{
for(size_t i=0; i<count; ++i) { pDest[i]=pSrc[i];
}
}
return pDest;
}
大家讨论下吧~