1:区别

memcpy可以拷贝任何数据类型的对象,指定拷贝的数据长度。
strcpy只能拷贝字符串了,它遇到'\0'就结束拷贝
2:性能
static inline char *__kernel_strcpy(char *dest, const char *src)

 
  1. {

  2. char*xdest = dest;

  3. asmvolatile("\n"

  4. "1: move.b  (%1)+,(%0)+\n"

  5. "   jne 1b"

  6. :"+a"(dest),"+a"(src)

  7. ::"memory");

  8. return xdest;

  9. }

  10. static __always_inline void*__memcpy(void*to,constvoid*from, size_t n)

  11. {

  12. int d0, d1, d2;

  13. asmvolatile("rep ; movsl\n\t"

  14. "movl %4,%%ecx\n\t"

  15. "andl $3,%%ecx\n\t"

  16. "jz 1f\n\t"

  17. "rep ; movsb\n\t"

  18. "1:"

  19. :"=&c"(d0),"=&D"(d1),"=&S"(d2)

  20. :"0"(n /4),"g"(n),"1"((long)to),"2"((long)from)

  21. :"memory");

  22. return to;

  23. }

memcpy()充分利用了机器字长为32位的特性(32位系统,一次内存读/写可操作4字节的数据, 对于64位系统,则一次可操作8字节数据)。先按4字节一组(movsl)拷贝,共复制n/4次;对剩下的零头再逐字节拷贝。如果支持,memcpy()还可以使用了MMX/SSE指令增加一次操作中的字节数,进一步提高效率。

3:健壮性
拷贝的缓冲区如果是非字符串,尽量用memcpy(),其实字符串使用memcpy也是很好的选择。你说的溢出可能是使用strcpy的\0结束问题或者是用memcpy指定的拷贝长度不对造成的。

参考