通常来说,这个函数的实现比较简单
我看了下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;
}
大家讨论下吧~