1、首先介绍这两个函数的原型:
#include
char *strcpy( char *to, const char *from );
#include从以上两个函数的参数类型和返回类型,可以看出两个函数的第一个不同点:void *memcpy( void *to, const void *from, size_t count );
a、strcpy只能应用字符类型的复制,而memcpy应用范围更广,任何类型都可以;
其次,函数memcpy多了一个count参数,用于拷贝指定字节大小的数据。从这可以得出它们的第二个不同点,
b、memcpy相比使用strcpy会更加的安全,当然也可以使用strcpy的安全板本strncpy函数;
从表面我们还是不能看到这两个函数更加深入的异同,以及它们到底哪个效率更高。下面从它们的源码出发,期望可以解决问题。
2、strcpy函数和memcpy的源码的windows版本
strcpy函数源码:
char * __cdecl strcpy(char * dst, const char * src)
{
char * cp = dst;
while( *cp++ = *src++ )
; /* Copy src over dst */
return( dst );
}
void * __cdecl memcpy (
void * dst,
const void * src,
size_t count
)
{
void * ret = dst;
#if defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC)
{
extern void RtlMoveMemory( void *, const void *, size_t count );
RtlMoveMemory( dst, src, count );
}
#else /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */
/*
* copy from lower addresses to higher addresses
*/
while (count--) {
*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
}
#endif /* defined (_M_MRX000) || defined (_M_ALPHA) || defined (_M_PPC) */
return(ret);
}
while( *cp++ = *src++ )
可以看出该循环退出的条件是*cp = '\0',也就是说,源字符串中的结尾‘\0’也被拷贝到目的字符串中,这个很关键。
而memcpy中退出循环是count为0,也就是按照用户的要求,拷贝count个字节。
所以从这可以得出两个函数的第3个不同点:
C、strcpy一定会拷贝字符串结尾符'\0',memcpy在拷贝字符串的时候,根据指定拷贝字节数拷贝字符串,是否拷贝‘\0’结束符,根据count的大小。
最后,从两个函数的源码中,可以分析出哪个函数的效率更快(当然是都拷贝相同的字符串),比较它们的关键代码,也就是循环,可以看出,memcpy函数中,有3个变量在变化,分别是count, dst, src,而strcpy只有两个变量变化,分别是cp和src,从这可以看出strcpy更胜一筹。再者,
*cp++ = *src++ 和 *(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;
效果是一样,但下面耗费更大,它有类型转换的花费,在上面中没有的,从这也可以看出strcpy更胜一筹。
综上两点,我认为在拷贝相同字符串,相同字节的情况下,strcpy的效率比memcpy效率更高。
3、下面再实践证明下,如下图。
测试代码:
#include
#include
int main()
{
char src[] = "hello,memcpy and strcpy!";
char dest[32];
memcpy(dest, src, 25);
//strcpy(dest, src);
return 0;
}
将memcpy(dest, src, 25);注释,取消下面strcpy(dest, src)运行代码用时如下:
从上可以看出,strcpy以微弱的优势,相比memcpy效率更快。
所以memcpy和strcpy的第四个不同点是:
d、在拷贝相同的字符串,且字节数相同(包括‘]0’)的情况下,strcpy效率比memcpy效率更快。
4、总结,memcpy和strcpy的区别与比较
a、strcpy只能应用字符类型的复制,而memcpy应用范围更广,任何类型都可以;
b、memcpy相比使用strcpy会更加的安全,当然也可以使用strcpy的安全板本strncpy函数;
c、strcpy一定会拷贝字符串结尾符'\0',memcpy在拷贝字符串的时候,根据指定拷贝字节数拷贝字符串,是否拷贝‘\0’结束符,根据count的大小;
d、在拷贝相同的字符串,且字节数相同(包括‘]0’)的情况下,strcpy效率比memcpy效率更快。