memcpy和strcpy区别以及它们的效率分析

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 );
}

memcpy函数源码:

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);
}

memcpy中的预定义不用考虑,现在都不支持了,先分析strcpy源码中关键代码:

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效率更快。







你可能感兴趣的:(C++)