c++ memcpy与strcpy的比较
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指定的拷貝長度不對造成的。
參考http://www.dewen.org/q/1469
轉載于:https://blog.51cto.com/mumufairy/1213378
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的c++ memcpy与strcpy的比较的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 写在《ASP.NET MVC 4 Web
- 下一篇: 创建一个列表