c++ memcpy与strcpy的比较
1:區(qū)別
memcpy可以拷貝任何數(shù)據(jù)類型的對象,指定拷貝的數(shù)據(jù)長度。
strcpy只能拷貝字符串了,它遇到'\0'就結(jié)束拷貝
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位系統(tǒng),一次內(nèi)存讀/寫可操作4字節(jié)的數(shù)據(jù), 對于64位系統(tǒng),則一次可操作8字節(jié)數(shù)據(jù))。先按4字節(jié)一組(movsl)拷貝,共復(fù)制n/4次;對剩下的零頭再逐字節(jié)拷貝。如果支持,memcpy()還可以使用了MMX/SSE指令增加一次操作中的字節(jié)數(shù),進一步提高效率。
3:健壯性
拷貝的緩沖區(qū)如果是非字符串,盡量用memcpy(),其實字符串使用memcpy也是很好的選擇。你說的溢出可能是使用strcpy的\0結(jié)束問題或者是用memcpy指定的拷貝長度不對造成的。
參考http://www.dewen.org/q/1469
轉(zhuǎn)載于:https://blog.51cto.com/mumufairy/1213378
創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎勵來咯,堅持創(chuàng)作打卡瓜分現(xiàn)金大獎總結(jié)
以上是生活随笔為你收集整理的c++ memcpy与strcpy的比较的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 写在《ASP.NET MVC 4 Web
- 下一篇: C++ 函数映射使用讲解