memcpy和strcpy的区别以及运行效率【笔记】

1、首先介绍这两个函数的原型:

 #include <cstring>
  char *strcpy( char *to, const char *from );

 #include <cstring>
  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++   和   <pre name="code" class="cpp">*(char *)dst = *(char *)src;
dst = (char *)dst + 1;
src = (char *)src + 1;


效果是一样,但下面耗费更大,它有类型转换的花费,在上面中没有的,从这也可以看出strcpy更胜一筹。

综上两点,我认为在拷贝相同字符串,相同字节的情况下,strcpy的效率比memcpy效率更高。

3、下面再实践证明下。

测试代码:

#include <stdio.h>
#include <string.h>
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效率更快。
 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值