1:区别
memcpy可以拷贝任何数据类型的对象,指定拷贝的数据长度。strcpy只能拷贝字符串了,它遇到'\0'就结束拷贝2:性能static inline char *__kernel_strcpy(char *dest, const char *src){
char*xdest = dest;
asmvolatile("\n"
"1: move.b (%1)+,(%0)+\n"
" jne 1b"
:"+a"(dest),"+a"(src)
::"memory");
return xdest;
}
static __always_inline void*__memcpy(void*to,constvoid*from, size_t n)
{
int d0, d1, d2;
asmvolatile("rep ; movsl\n\t"
"movl %4,%%ecx\n\t"
"andl $3,%%ecx\n\t"
"jz 1f\n\t"
"rep ; movsb\n\t"
"1:"
:"=&c"(d0),"=&D"(d1),"=&S"(d2)
:"0"(n /4),"g"(n),"1"((long)to),"2"((long)from)
:"memory");
return to;
}
memcpy()充分利用了机器字长为32位的特性(32位系统,一次内存读/写可操作4字节的数据, 对于64位系统,则一次可操作8字节数据)。先按4字节一组(movsl)拷贝,共复制n/4次;对剩下的零头再逐字节拷贝。如果支持,memcpy()还可以使用了MMX/SSE指令增加一次操作中的字节数,进一步提高效率。
3:健壮性拷贝的缓冲区如果是非字符串,尽量用memcpy(),其实字符串使用memcpy也是很好的选择。你说的溢出可能是使用strcpy的\0结束问题或者是用memcpy指定的拷贝长度不对造成的。参考