最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++中memcpy和memmove的區(qū)別總結(jié)

 更新時(shí)間:2014年10月09日 11:24:02   作者:果凍想  
這篇文章主要介紹了C++中memcpy和memmove的區(qū)別總結(jié),這個(gè)問(wèn)題經(jīng)常出現(xiàn)在C++的面試題目中,需要的朋友可以參考下

變態(tài)的命名

我們?cè)趯?xiě)程序時(shí),一般講究見(jiàn)到變量的命名,就能讓別人基本知道該變量的含義。memcpy內(nèi)存拷貝,沒(méi)有問(wèn)題;memmove,內(nèi)存移動(dòng)?錯(cuò),如果這樣理解的話(huà),那么這篇文章你就必須要好好看看了,memmove還是內(nèi)存拷貝。那么既然memcpy和memmove二者都是內(nèi)存拷貝,那二者究竟有什么區(qū)別呢?

先說(shuō)memcpy

你有沒(méi)有好好的參加過(guò)一場(chǎng)C++筆試。讓你寫(xiě)出memcpy的實(shí)現(xiàn),這是多么常見(jiàn)的筆試題啊。現(xiàn)在,拿起你的演算紙和筆;是的,是筆和紙,不是讓你在你的IDE上寫(xiě)。寫(xiě)不出來(lái)?看下面吧:

復(fù)制代碼 代碼如下:

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的實(shí)現(xiàn)很簡(jiǎn)單,一般在筆試時(shí),出現(xiàn)寫(xiě)源碼的題目,無(wú)非就是需要注意以下幾點(diǎn):

1.確定函數(shù)原型;
2.判斷參數(shù)合法性;
3.邏輯實(shí)現(xiàn)(考慮各種情況,統(tǒng)稱(chēng)邏輯實(shí)現(xiàn));
4.錯(cuò)誤處理。

當(dāng)然了,我的這個(gè)沒(méi)有錯(cuò)誤處理,也不需要錯(cuò)誤處理。上面,我寫(xiě)出了memcpy的實(shí)現(xiàn)源碼,實(shí)現(xiàn)原理如下圖所示:

這樣下去,上面的代碼會(huì)運(yùn)行的很好,如果出現(xiàn)下面的情況呢?

i、n、k的內(nèi)存和J、e、l的內(nèi)存地址重合了,現(xiàn)在再使用上面的代碼進(jìn)行copy時(shí),會(huì)出現(xiàn)什么問(wèn)題呢?你有沒(méi)有想過(guò)這個(gè)問(wèn)題。如果沒(méi)有,那就現(xiàn)在想想,不急著閱讀下面的內(nèi)容。

然后,我再留一個(gè)問(wèn)題,上面的代碼中,為什么都需要將void *轉(zhuǎn)換成char *呢?比如:

復(fù)制代碼 代碼如下:

char *tmp = (char *)dest;

可以留言回答哦。

再說(shuō)memmove

memmove也是用來(lái)實(shí)現(xiàn)內(nèi)存的直接拷貝的。說(shuō)起這個(gè)命名,我個(gè)人覺(jué)的多少還是有點(diǎn)坑的。既然memmove也是用來(lái)內(nèi)存數(shù)據(jù)移動(dòng)的,那就先來(lái)看看memmove的實(shí)現(xiàn)源碼。

復(fù)制代碼 代碼如下:

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復(fù)雜一些;再仔細(xì)一看,多了些什么?哦,多了一個(gè)else分支,而正是這個(gè)else分支,就處理了當(dāng)src和dest的內(nèi)存重合的問(wèn)題。

memcpy和memmove的比較

從實(shí)現(xiàn)源碼中的確能看出一些貓膩,當(dāng)出現(xiàn)了src和dest的內(nèi)存有重合的時(shí)機(jī)時(shí),memmove的處理規(guī)則是從后往前進(jìn)行copy。當(dāng)然了,重合的問(wèn)題,需要考慮的以下兩種場(chǎng)合。

如圖所示,當(dāng)出現(xiàn)(1)對(duì)應(yīng)的情況時(shí),就需要先從src的頭部開(kāi)始復(fù)制;也就是memmove源碼中的if分支,這部分源碼和memcpy的實(shí)現(xiàn)是一致的;當(dāng)出現(xiàn)(2)對(duì)應(yīng)的情況時(shí),就需要先從src的尾部開(kāi)始復(fù)制,防止出現(xiàn)了覆蓋現(xiàn)象。這就是memmove比memcpy多的一個(gè)考慮點(diǎn),所以說(shuō),在實(shí)際使用時(shí),使用memmove是比memcpy更安全的。

總結(jié)

總結(jié)到了這里,我覺(jué)的我已經(jīng)把問(wèn)題說(shuō)清楚了。你說(shuō)呢?如果你還有什么好的想法,歡迎你和我分享。

相關(guān)文章

  • 淺析C++如何跨模塊釋放內(nèi)存

    淺析C++如何跨模塊釋放內(nèi)存

    這篇文章主要為大家詳細(xì)介紹了C++中跨模塊釋放內(nèi)存的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的小伙伴可以了解下
    2024-02-02
  • C++如何獲取本機(jī)的IP地址

    C++如何獲取本機(jī)的IP地址

    這篇文章主要為大家詳細(xì)介紹了C++如何獲取本機(jī)IP地址小程序,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01
  • 詳解C++ 中的臨時(shí)對(duì)象

    詳解C++ 中的臨時(shí)對(duì)象

    這篇文章主要介紹了C++ 中的臨時(shí)對(duì)象的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)c++,感興趣的朋友可以了解下
    2020-08-08
  • 使用C語(yǔ)言調(diào)用luajit的方法詳解

    使用C語(yǔ)言調(diào)用luajit的方法詳解

    C語(yǔ)言是一種非常流行的編程語(yǔ)言,而Lua是一種基于C語(yǔ)言開(kāi)發(fā)的腳本語(yǔ)言,在Lua的各種實(shí)現(xiàn)中,luajit也是其中一種非常流行的實(shí)現(xiàn),在本文中,我將為大家介紹如何使用C語(yǔ)言調(diào)用luajit,并且詳細(xì)介紹如何傳入?yún)?shù),傳入結(jié)構(gòu)體參數(shù),以及獲取返回值
    2023-11-11
  • C語(yǔ)言實(shí)現(xiàn)掃雷游戲詳細(xì)代碼實(shí)例

    C語(yǔ)言實(shí)現(xiàn)掃雷游戲詳細(xì)代碼實(shí)例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)掃雷游戲詳細(xì)代碼實(shí)例,有感興趣的同學(xué)可以借鑒參考下
    2021-02-02
  • 一文搞懂C語(yǔ)言中的文件操作

    一文搞懂C語(yǔ)言中的文件操作

    文件操作想必大家掌握的并不熟練,確實(shí)因?yàn)槲覀冇玫牟⒉欢?,而本?jié)內(nèi)容能夠讓大家初步認(rèn)識(shí)文件操作,從文件認(rèn)識(shí)到文件使用,讓我們對(duì)c語(yǔ)言文件操作有個(gè)初步的了解
    2022-11-11
  • Qt 智能指針QScopedPoint用法小結(jié)

    Qt 智能指針QScopedPoint用法小結(jié)

    智能指針是C++11引入的一種指針?lè)庋b類(lèi)型,用于自動(dòng)管理動(dòng)態(tài)分配的內(nèi)存,本文主要介紹了Qt 智能指針QScopedPoint用法小結(jié),感興趣的可以了解一下
    2024-01-01
  • 在 VSCode 中配置 C++ 開(kāi)發(fā)環(huán)境的詳細(xì)教程

    在 VSCode 中配置 C++ 開(kāi)發(fā)環(huán)境的詳細(xì)教程

    本文詳細(xì)介紹了如何在Visual Studio Code(VSCode)中配置C++開(kāi)發(fā)環(huán)境,包括安裝必要的工具、配置編譯器、設(shè)置調(diào)試環(huán)境等步驟,通過(guò)這些步驟,你可以快速搭建C++開(kāi)發(fā)環(huán)境,實(shí)現(xiàn)高效編程,感興趣的朋友一起看看吧
    2025-01-01
  • centos 7 vscode cmake 編譯c++工程的教程詳解

    centos 7 vscode cmake 編譯c++工程的教程詳解

    這篇文章給大家介紹了centos 7 使用vscode+cmake配置簡(jiǎn)單c++項(xiàng)目的方法,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧
    2020-05-05
  • C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)小設(shè)計(jì)

    C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)小設(shè)計(jì)

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言學(xué)生成績(jī)管理系統(tǒng)小設(shè)計(jì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-01-01

最新評(píng)論

吉水县| 云梦县| 旬邑县| 辽阳市| 莱芜市| 抚州市| 阜康市| 宣汉县| 辽阳县| 万山特区| 苏尼特左旗| 怀宁县| 涞水县| 松江区| 游戏| 沂源县| 大庆市| 汉寿县| 包头市| 乌兰浩特市| 定州市| 文水县| 霍林郭勒市| 秦安县| 江川县| 固始县| 常德市| 铜山县| 新巴尔虎右旗| 新河县| 江西省| 沙湾县| 梅河口市| 崇明县| 商河县| 股票| 响水县| 曲周县| 慈利县| 彭泽县| 勃利县|