日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
一文弄清楚 push_back 和 emplace_back 的區(qū)別

既然兩者功能一樣,那它們之間有什么區(qū)別呢 ?使用的時(shí)候如何選擇呢 ?

創(chuàng)新互聯(lián)長(zhǎng)期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為延津企業(yè)提供專業(yè)的成都網(wǎng)站制作、成都網(wǎng)站建設(shè),延津網(wǎng)站改版等技術(shù)服務(wù)。擁有10多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

效率

emplace_back 在效率上比 push_back 要好一些,請(qǐng)看下面的例子:

#include
#include
using namespace std;

class MyTest
{
public:
//普通構(gòu)造
MyTest(int id,int age):m_id(id),m_age(age)
{
cout << "ceate MyTest class..." << this << endl;
}
//拷貝構(gòu)造
MyTest(const MyTest &t):m_id(t.m_id),m_age(t.m_age)
{
cout << "copy construct called..." << this << endl;
}
//移動(dòng)構(gòu)造
MyTest(const MyTest &&t)
{
m_id = std::move(t.m_id);
m_age = std::move(t.m_age);
cout << "move contruct called.." << this << endl;
}
//析構(gòu)
~MyTest()
{
cout << "destory MyTest class..." << this << endl;
}
private:
int m_id; //id成員
int m_age;//age成員
};

int main(int argc, char *argv[])
{
vector vec;
vec.reserve(2); //預(yù)先分配內(nèi)存
cout << "\n ------ push_back --------" << endl;
vec.push_back(MyTest(1,20));
cout << "\n ------ emplace_back --------" << endl;
vec.emplace_back(1,20);
cout << "\n -------- finish -------- " << endl;
}

使用 g++ -g -Wall -std=c++11 -o t t.cpp 命令編譯,運(yùn)行程序,結(jié)果如下:

 ------ push_back --------
ceate MyTest class...
move contruct called..
destory MyTest class...

------ emplace_back --------
ceate MyTest class...

-------- finish --------
destory MyTest class...
destory MyTest class...

從結(jié)果可以看出,同樣是在容器尾部加入一個(gè)元素,push_back 和 emplace_back 的過(guò)程是不一樣的;

  • push_back 的過(guò)程

構(gòu)造一個(gè)臨時(shí)對(duì)象

調(diào)用移動(dòng)構(gòu)造函數(shù)把臨時(shí)對(duì)象的副本拷貝到容器末尾增加的元素中

調(diào)用析構(gòu)釋放臨時(shí)對(duì)象

  • emplace_back 的過(guò)程

調(diào)用構(gòu)造函數(shù)在容器末尾增加一個(gè)元素

同樣是在容器尾部增加一個(gè)元素,emplace_back 比 push_back 少了一次對(duì)象的構(gòu)造和析構(gòu), 所以,emplace_back 比 push_back 更高效, 具體能高效多少呢,這里進(jìn)行了一個(gè)插入 一百萬(wàn) 個(gè)對(duì)象的測(cè)試,emplace_back 比 push_back 快大概 20% ,下面是測(cè)試代碼 :

//獲取當(dāng)前時(shí)間,單位: 毫秒
int64_t cur_msec()
{
struct timespec tp1;
clock_gettime(CLOCK_REALTIME, &tp1);
return (tp1.tv_sec * 1000 + (int64_t)tp1.tv_nsec / 1000000.0);
}
//測(cè)試函數(shù)
void test()
{
vector vec1;
vector vec2;
vec1.reserve(1000000);
vec2.reserve(1000000);

int64_t t1 = cur_msec();
for (size_t i = 0; i < 1000000; i++)
{
vec1.push_back(MyTest(1,20));
}
int64_t t2 = cur_msec();
for (size_t i = 0; i < 1000000; i++)
{
vec2.emplace_back(1,20);
}
int64_t t3 = cur_msec();

cout << " push_back cost " << (t2 - t1) << " millisecond " << endl;
cout << " emplace_back cost " << (t3 - t2) << " millisecond " << endl;
}

emplace_back 的缺點(diǎn)

既然 emplace_back 比 push_back 更高效,是不是每次都用 emplace_back 就完了呢?

我們?nèi)粘懘a,除了執(zhí)行率之外,還要考慮可讀性,理解成本等,雖然emplace_back 效率高些,但是它也是有缺點(diǎn)的,比如:

vec1.push_back(1000000);
vec2.emplace_back(1000000);

第一行程序代碼很好理解,往 容器vec1尾部加入一個(gè)整數(shù) 1000000,然而,第二行程序代碼就不是很直觀了,由于我們不知道 vec2 的實(shí)際類型,所以無(wú)法獲得這行代碼執(zhí)行的結(jié)果。

假如,vec2 的類型是 vector,那么它的含義和第一行一樣,往容器vec2尾部添加整數(shù) 1000000。

假如,vec2 的類型是 vector< vector >,那么它就構(gòu)造了一個(gè)包含 1000000 個(gè)元素的容器,按照每個(gè)元素 4 個(gè)字節(jié)來(lái)計(jì)算,執(zhí)行第二行代碼需要分配差不多近 4M 的內(nèi)存空間。

如何選擇

emplace_back 的缺點(diǎn)是代碼可讀性相對(duì)差些,因此,對(duì)于往容器尾部添加元素的操作,選擇 push_back將會(huì)使你的代碼可讀性更好,能更好的表達(dá)出代碼編寫者的目的,代碼更健壯。

像上節(jié)中的例子,一個(gè) vector< vector > 類型的容器 vec,vec.emplace_back(1000000) 能編譯通過(guò),在運(yùn)行到這行代碼之前可能還無(wú)法發(fā)現(xiàn)錯(cuò)誤,但是如果調(diào)用 vec.push_back(1000000) 在編譯的時(shí)候就會(huì)報(bào)錯(cuò),能更早的發(fā)現(xiàn)問(wèn)題。

當(dāng)然,既然 emplace_back 比 push_back 更快,我們也不能因?yàn)槿菀壮鲥e(cuò)就不使用它,在對(duì)效率有要求的場(chǎng)景中,推薦使用 emplace_back,當(dāng)對(duì)效率要求沒(méi)那么高,或者使用 emplace_back 和 push_back 效率差別不大時(shí),從項(xiàng)目代碼可讀性,可維護(hù)性的角度考慮的話,優(yōu)先使用 push_back。


文章題目:一文弄清楚 push_back 和 emplace_back 的區(qū)別
分享URL:http://www.dlmjj.cn/article/dhhhjih.html