C++?std::copy與memcpy區(qū)別小結(jié)
前言:最近在讀項目源碼,發(fā)現(xiàn)有些地方用std::copy,有些地方用memcpy。但是并不知道為什么要這樣,但是原作者也不認識,就只好自己研究一下了。
對比
相同:
- 都是復制拷貝函數(shù)。
- 都是通過指針操作進行內(nèi)存復制。
不同:
- std::copy是C++中的函數(shù),memcpy是C中的函數(shù)。
- std::copy更加靈活,可以在不同類型的對象之間進行復制;memcpy只能用于字節(jié)級別的復制,不能處理自定義類型。
- std::copy拷貝類的時候,會調(diào)用貝構(gòu)造函數(shù)或賦值運算符來復制;memcpy只會按字節(jié)復制,不會調(diào)用類的任何成員函數(shù)。
- std::copy的性能比memcpy會更好
使用場景
從兩者的不同點就可以看的出來,大致使用場景的區(qū)別了。
適合std::copy:
- 處理非平凡類型,使用memcpy會導致未定義行為,std::copy能確保處理正確的生命周期。
- 對于結(jié)構(gòu)體或者類中有指針成員變量的情況,memcpy進行拷貝只是進行了淺拷貝,會導致指針成員變量的指向不正確,從而導致未定義行為。
- 當源和目標內(nèi)存區(qū)域有重疊的時候。
適合memcpy:
- 對于簡單數(shù)據(jù)類型(例如int、char、float等基本的類型),使用memcpy而不是std::copy。
- 當源和目標內(nèi)存區(qū)域沒有重疊,memcpy可以直接位拷貝,不會涉及迭代器和復制構(gòu)造函數(shù)等操作。
總結(jié)以下,C++才加入的類型或者自行定義的類型、涉及深拷貝、源和目標內(nèi)存區(qū)域有重疊的時候適合std::copy,其它時候用memcpy好點。
補充:平凡類型trivial和非平凡類型non-trivial。
這個主要是針對類中的四個函數(shù)來說的:構(gòu)造函數(shù)、復制構(gòu)造函數(shù)、賦值函數(shù)以及析構(gòu)函數(shù)。
如果滿足以下三點任意一點,就是非平凡類型non-trivial:
- 顯式定義了上面四種函數(shù)。
- 類里面有非靜態(tài)非POD的成員(POD可以理解為包含平凡類、標準布局類)。
- 有基類。
使用
std::copy
把src里面的內(nèi)容復制到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起始地址,復制長度
到此這篇關(guān)于C++ std::copy與memcpy區(qū)別小結(jié)的文章就介紹到這了,更多相關(guān)C++ std::copy memcpy內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++實現(xiàn)從數(shù)組中同時取出最大最小元素算法示例
這篇文章主要介紹了C++實現(xiàn)從數(shù)組中同時取出最大最小元素算法,結(jié)合具體實例形式分析了C++通過數(shù)組的遍歷、排序獲取最大與最小元素的相關(guān)操作技巧,需要的朋友可以參考下2017-09-09
Vs2022環(huán)境下安裝低版本.net framework的實現(xiàn)步驟
本文主要介紹了Vs2022環(huán)境下安裝低版本.net framework的實現(xiàn)步驟,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2022-04-04

