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

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

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

變態(tài)的命名

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

先說memcpy

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

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

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

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

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

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

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

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

char *tmp = (char *)dest;

可以留言回答哦。

再說memmove

memmove也是用來實(shí)現(xiàn)內(nèi)存的直接拷貝的。說起這個命名,我個人覺的多少還是有點(diǎn)坑的。既然memmove也是用來內(nèi)存數(shù)據(jù)移動的,那就先來看看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ì)一看,多了些什么?哦,多了一個else分支,而正是這個else分支,就處理了當(dāng)src和dest的內(nèi)存重合的問題。

memcpy和memmove的比較

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

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

總結(jié)

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

相關(guān)文章

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

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

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

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

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

    詳解C++ 中的臨時對象

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

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

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

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

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

    一文搞懂C語言中的文件操作

    文件操作想必大家掌握的并不熟練,確實(shí)因為我們用的并不多,而本節(jié)內(nèi)容能夠讓大家初步認(rèn)識文件操作,從文件認(rèn)識到文件使用,讓我們對c語言文件操作有個初步的了解
    2022-11-11
  • Qt 智能指針QScopedPoint用法小結(jié)

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

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

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

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

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

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

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

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

最新評論

东丽区| 太康县| 吐鲁番市| 静乐县| 宜丰县| 图木舒克市| 高密市| 重庆市| 襄城县| 海安县| 镇沅| 台安县| 永定县| 开鲁县| 阿克陶县| 炉霍县| 简阳市| 大姚县| 昭平县| 长春市| 格尔木市| 赤峰市| 建始县| 淮安市| 南部县| 襄垣县| 陆丰市| 山阳县| 上犹县| 城步| 灵璧县| 溆浦县| 磴口县| 广昌县| 济源市| 巴青县| 南汇区| 南澳县| 阆中市| 成都市| 鲁甸县|