C++?std::copy與memcpy區(qū)別小結(jié)
前言:最近在讀項(xiàng)目源碼,發(fā)現(xiàn)有些地方用std::copy,有些地方用memcpy。但是并不知道為什么要這樣,但是原作者也不認(rèn)識(shí),就只好自己研究一下了。
對(duì)比
相同:
- 都是復(fù)制拷貝函數(shù)。
- 都是通過(guò)指針操作進(jìn)行內(nèi)存復(fù)制。
不同:
- std::copy是C++中的函數(shù),memcpy是C中的函數(shù)。
- std::copy更加靈活,可以在不同類型的對(duì)象之間進(jìn)行復(fù)制;memcpy只能用于字節(jié)級(jí)別的復(fù)制,不能處理自定義類型。
- std::copy拷貝類的時(shí)候,會(huì)調(diào)用貝構(gòu)造函數(shù)或賦值運(yùn)算符來(lái)復(fù)制;memcpy只會(huì)按字節(jié)復(fù)制,不會(huì)調(diào)用類的任何成員函數(shù)。
- std::copy的性能比memcpy會(huì)更好
使用場(chǎng)景
從兩者的不同點(diǎn)就可以看的出來(lái),大致使用場(chǎng)景的區(qū)別了。
適合std::copy:
- 處理非平凡類型,使用memcpy會(huì)導(dǎo)致未定義行為,std::copy能確保處理正確的生命周期。
- 對(duì)于結(jié)構(gòu)體或者類中有指針成員變量的情況,memcpy進(jìn)行拷貝只是進(jìn)行了淺拷貝,會(huì)導(dǎo)致指針成員變量的指向不正確,從而導(dǎo)致未定義行為。
- 當(dāng)源和目標(biāo)內(nèi)存區(qū)域有重疊的時(shí)候。
適合memcpy:
- 對(duì)于簡(jiǎn)單數(shù)據(jù)類型(例如int、char、float等基本的類型),使用memcpy而不是std::copy。
- 當(dāng)源和目標(biāo)內(nèi)存區(qū)域沒有重疊,memcpy可以直接位拷貝,不會(huì)涉及迭代器和復(fù)制構(gòu)造函數(shù)等操作。
總結(jié)以下,C++才加入的類型或者自行定義的類型、涉及深拷貝、源和目標(biāo)內(nèi)存區(qū)域有重疊的時(shí)候適合std::copy,其它時(shí)候用memcpy好點(diǎn)。
補(bǔ)充:平凡類型trivial和非平凡類型non-trivial。
這個(gè)主要是針對(duì)類中的四個(gè)函數(shù)來(lái)說(shuō)的:構(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末尾下一個(gè),dst起始地址
memcpy
因?yàn)閙emcpy是C那邊的,所以用vector不太合適,適合簡(jiǎn)單的數(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ù)制長(zhǎng)度
到此這篇關(guān)于C++ std::copy與memcpy區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)C++ std::copy memcpy內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- C++中std::setw()的用法解讀
- c++中std::placeholders的使用方法
- c++ std::sort使用自定義的比較函數(shù)排序方式
- C++中std::thread{}和std::thread()用法
- C++中std::tuple和std::pair的高級(jí)用法
- c++之std::get_time和std::put_time
- C++中std::ios_base::floatfield報(bào)錯(cuò)已解決
- C++中std::invalid_argument報(bào)錯(cuò)解決
- C++中std::ifstream::readsome和std::ifstream::read的區(qū)別解析
- C++中的std::funture和std::promise實(shí)例詳解
- C++中std::transform的使用小結(jié)
- C++實(shí)現(xiàn)std::set的示例項(xiàng)目
相關(guān)文章
C語(yǔ)言如何計(jì)算兩個(gè)數(shù)的最小公倍數(shù)
這篇文章主要介紹了C語(yǔ)言如何計(jì)算兩個(gè)數(shù)的最小公倍數(shù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11VC++中HTControl控件類之CHTRichEdit富文本編輯控件實(shí)例
這篇文章主要介紹了VC++中HTControl控件類之CHTRichEdit富文本編輯控件,是一個(gè)比較實(shí)用的功能,需要的朋友可以參考下2014-08-08C++深入講解類與對(duì)象之OOP面向?qū)ο缶幊膛c封裝
學(xué)習(xí)過(guò)C語(yǔ)言的小伙伴知道:C語(yǔ)言是面向過(guò)程的,關(guān)注的是過(guò)程,分析出求解問(wèn)題的步驟,通過(guò)函數(shù)調(diào)用逐步解決問(wèn)題,接下來(lái)讓我們?cè)敿?xì)的了解2022-05-05C++?LeetCode1769移動(dòng)所有球到每個(gè)盒子最小操作數(shù)示例
這篇文章主要為大家介紹了C++?LeetCode1769移動(dòng)所有球到每個(gè)盒子所需最小操作數(shù)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-12-12