程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++中memcpy和memmove的差別總結

C++中memcpy和memmove的差別總結

編輯:關於C++

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更平安的。

總結

總結到了這裡,我覺的我曾經把成績說清晰了。你說呢?假如你還有甚麼好的設法主意,迎接你和我分享。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved