C++中memcpy和memmove的差別總結。本站提示廣大學習愛好者:(C++中memcpy和memmove的差別總結)文章只能為提供參考,不一定能成為您想要的結果。以下是C++中memcpy和memmove的差別總結正文
失常的定名
我們在寫法式時,普通講求見到變量的定名,就可以讓他人根本曉得該變量的寄義。memcpy內存拷貝,沒有成績;memmove,內存挪動?錯,假如如許懂得的話,那末這篇文章你就必需要好悅目看了,memmove照樣內存拷貝。那末既然memcpy和memmove兩者都是內存拷貝,那兩者畢竟有甚麼差別呢?
先說memcpy
你有無好好的加入過一場C++口試。讓你寫出memcpy的完成,這是何等罕見的口試題啊。如今,拿起你的演算紙和筆;是的,是筆和紙,不是讓你在你的IDE上寫。寫不出來?看上面吧:
void *mymemcpy(void *dest, const void *src, size_t count)
{
assert(dest != NULL || src != NULL);
char *tmp = (char *)dest;
char *p = (char *)src;
while (count--)
{
*tmp++ = *p++;
}
return dest;
}
memcpy的完成很簡略,普通在口試時,湧現寫源碼的標題,不過就是須要留意以下幾點:
1.肯定函數原型;
2.斷定參數正當性;
3.邏輯完成(斟酌各類情形,統稱邏輯完成);
4.毛病處置。
固然了,我的這個沒有毛病處置,也不須要毛病處置。下面,我寫出了memcpy的完成源碼,完成道理以下圖所示:
如許下去,下面的代碼會運轉的很好,假如湧現上面的情形呢?
i、n、k的內存和J、e、l的內存地址重合了,如今再應用下面的代碼停止copy時,會湧現甚麼成績呢?你有無想過這個成績。假如沒有,那就如今想一想,不急著浏覽上面的內容。
然後,我再留一個成績,下面的代碼中,為何都須要將void *轉換成char *呢?好比:
char *tmp = (char *)dest;
可以留言答復哦。
再說memmove
memmove也是用來完成內存的直接拷貝的。說起這個定名,我小我覺的若干照樣有點坑的。既然memmove也是用來內存數據挪動的,那就先來看看memmove的完成源碼。
void *mymemmove(void *dest, const void *src, size_t count)
{
assert(dest != NULL || src != NULL)
if (dst < src)
{
char *p = (char *)dest;
char *q = (char *)src;
while (count--)
{
*p++ = *q++;
}
}
else
{
char *p = (char *)dest + count;
char *q = (char *)src + count;
while (count--)
{
*--p = *--q;
}
}
return dest;
}
從源碼看,memmove切實其實比memcpy龐雜一些;再細心一看,多了些甚麼?哦,多了一個else分支,而恰是這個else分支,就處置了當src和dest的內存重合的成績。
memcpy和memmove的比擬
從完成源碼中切實其實能看出一些貓膩,當湧現了src和dest的內存有重合的機會時,memmove的處置規矩是從後往進步行copy。固然了,重合的成績,須要斟酌的以下兩種場所。
如圖所示,當湧現(1)對應的情形時,就須要先從src的頭部開端復制;也就是memmove源碼中的if分支,這部門源碼和memcpy的完成是分歧的;當湧現(2)對應的情形時,就須要先從src的尾部開端復制,避免湧現了籠罩景象。這就是memmove比memcpy多的一個斟酌點,所以說,在現實應用時,應用memmove是比memcpy更平安的。
總結
總結到了這裡,我覺的我曾經把成績說清晰了。你說呢?假如你還有甚麼好的設法主意,迎接你和我分享。