欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C++?std::copy與memcpy區(qū)別小結(jié)

 更新時間:2024年05月08日 08:31:10   作者:魔法自動機(jī)  
本文主要介紹了C++?std::copy與memcpy區(qū)別小結(jié),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

前言:最近在讀項目源碼,發(fā)現(xiàn)有些地方用std::copy,有些地方用memcpy。但是并不知道為什么要這樣,但是原作者也不認(rèn)識,就只好自己研究一下了。

對比

相同:

  • 都是復(fù)制拷貝函數(shù)。
  • 都是通過指針操作進(jìn)行內(nèi)存復(fù)制。

不同:

  • std::copy是C++中的函數(shù),memcpy是C中的函數(shù)。
  • std::copy更加靈活,可以在不同類型的對象之間進(jìn)行復(fù)制;memcpy只能用于字節(jié)級別的復(fù)制,不能處理自定義類型。
  • std::copy拷貝類的時候,會調(diào)用貝構(gòu)造函數(shù)或賦值運(yùn)算符來復(fù)制;memcpy只會按字節(jié)復(fù)制,不會調(diào)用類的任何成員函數(shù)。
  • std::copy的性能比memcpy會更好

使用場景

從兩者的不同點(diǎn)就可以看的出來,大致使用場景的區(qū)別了。

適合std::copy:

  • 處理非平凡類型,使用memcpy會導(dǎo)致未定義行為,std::copy能確保處理正確的生命周期。
  • 對于結(jié)構(gòu)體或者類中有指針成員變量的情況,memcpy進(jìn)行拷貝只是進(jìn)行了淺拷貝,會導(dǎo)致指針成員變量的指向不正確,從而導(dǎo)致未定義行為。
  • 當(dāng)源和目標(biāo)內(nèi)存區(qū)域有重疊的時候。

適合memcpy:

  • 對于簡單數(shù)據(jù)類型(例如int、char、float等基本的類型),使用memcpy而不是std::copy。
  • 當(dāng)源和目標(biāo)內(nèi)存區(qū)域沒有重疊,memcpy可以直接位拷貝,不會涉及迭代器和復(fù)制構(gòu)造函數(shù)等操作。

總結(jié)以下,C++才加入的類型或者自行定義的類型、涉及深拷貝、源和目標(biāo)內(nèi)存區(qū)域有重疊的時候適合std::copy,其它時候用memcpy好點(diǎn)。

補(bǔ)充:平凡類型trivial和非平凡類型non-trivial。
這個主要是針對類中的四個函數(shù)來說的:構(gòu)造函數(shù)、復(fù)制構(gòu)造函數(shù)、賦值函數(shù)以及析構(gòu)函數(shù)。
如果滿足以下三點(diǎn)任意一點(diǎn),就是非平凡類型non-trivial:

  • 顯式定義了上面四種函數(shù)。
  • 類里面有非靜態(tài)非POD的成員(POD可以理解為包含平凡類、標(biāo)準(zhǔn)布局類)。
  • 有基類。

使用

std::copy

把src里面的內(nèi)容復(fù)制到dst。

vector<int>src= { 0, 1, 2, 3, 4 };
vector<int>dst(5, 0);
std::copy(src.begin(), src.end(),dst.begin());// src起始地址,src末尾下一個,dst起始地址

memcpy

因為memcpy是C那邊的,所以用vector不太合適,適合簡單的數(shù)據(jù)類型。

const char src[50] = "http://www.runoob.com";
char dst[50];
// strlen(src)不包括結(jié)束符
memcpy(dst, src, strlen(src)+1);// dst起始地址,src起始地址,復(fù)制長度

到此這篇關(guān)于C++ std::copy與memcpy區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)C++ std::copy memcpy內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • opencv3/C++ FLANN特征匹配方式

    opencv3/C++ FLANN特征匹配方式

    今天小編就為大家分享一篇opencv3/C++ FLANN特征匹配方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-12-12
  • C語言如何計算兩個數(shù)的最小公倍數(shù)

    C語言如何計算兩個數(shù)的最小公倍數(shù)

    這篇文章主要介紹了C語言如何計算兩個數(shù)的最小公倍數(shù),具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++容器適配器的概念與示例

    C++容器適配器的概念與示例

    C++?STL(標(biāo)準(zhǔn)模板庫)是一套功能強(qiáng)大的?C++?模板類,提供了通用的模板類和函數(shù),這些模板類和函數(shù)可以實現(xiàn)多種流行和常用的算法和數(shù)據(jù)結(jié)構(gòu),如向量、鏈表、隊列、棧,今天我們來探究一下stl容器適配器的使用吧
    2023-01-01
  • VC++中HTControl控件類之CHTRichEdit富文本編輯控件實例

    VC++中HTControl控件類之CHTRichEdit富文本編輯控件實例

    這篇文章主要介紹了VC++中HTControl控件類之CHTRichEdit富文本編輯控件,是一個比較實用的功能,需要的朋友可以參考下
    2014-08-08
  • C語言 操作符#與##使用方法詳解

    C語言 操作符#與##使用方法詳解

    在類函數(shù)宏中(帶參數(shù)的宏),#號作為一個預(yù)處理運(yùn)算符,可以把記號轉(zhuǎn)換成字符串。##相當(dāng)于連接符,它會將兩邊的內(nèi)容連接起來,形成新的標(biāo)識符,下面請看詳細(xì)的教程
    2022-04-04
  • C++深入講解類與對象之OOP面向?qū)ο缶幊膛c封裝

    C++深入講解類與對象之OOP面向?qū)ο缶幊膛c封裝

    學(xué)習(xí)過C語言的小伙伴知道:C語言是面向過程的,關(guān)注的是過程,分析出求解問題的步驟,通過函數(shù)調(diào)用逐步解決問題,接下來讓我們詳細(xì)的了解
    2022-05-05
  • QT中QDockWidget控件的使用小結(jié)

    QT中QDockWidget控件的使用小結(jié)

    QDockWidget類提供了一個小部件,可以停靠在QMainWindow中,也可以作為桌面上的頂級窗口浮動,本文主要介紹了QT中QDockWidget控件的使用小結(jié),感興趣的可以了解一下
    2024-01-01
  • C/C++ 淺拷貝和深拷貝的實例詳解

    C/C++ 淺拷貝和深拷貝的實例詳解

    這篇文章主要介紹了C/C++ 淺拷貝和深拷貝的實例詳解的相關(guān)資料,幫助大家理解這部分知識提供了基礎(chǔ)知識及實例,需要的朋友可以參考下
    2017-08-08
  • C++?LeetCode1769移動所有球到每個盒子最小操作數(shù)示例

    C++?LeetCode1769移動所有球到每個盒子最小操作數(shù)示例

    這篇文章主要為大家介紹了C++?LeetCode1769移動所有球到每個盒子所需最小操作數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-12-12
  • C++快速排序超詳細(xì)講解

    C++快速排序超詳細(xì)講解

    快速排序是一種高效的排序算法,通過分治法將數(shù)組劃分為兩部分,遞歸排序,直到整個數(shù)組有序,通過代碼解析和示例,詳細(xì)解釋了快速排序的工作原理和實現(xiàn)過程,需要的朋友可以參考下
    2025-03-03

最新評論