我是靠谱客的博主 风趣裙子,最近开发中收集的这篇文章主要介绍关于emplace_back()和push_back()的比较,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

今天参考别人的代码,发现别人在使用emplace_back()而不是push_back(),我就去查了一下,发现原因是这样的:

emplace_back能就地通过参数构造对象,不需要拷贝或者移动内存,相比push_back能更好地避免内存的拷贝与移动,使容器插入元素的性能得到进一步提升,就是零拷贝

零拷贝就是一种避免 CPU 将数据从一块存储拷贝到另外一块存储的技术。

零拷贝技术可以减少数据拷贝和共享总线操作的次数。

在C++中,vector的一个成员函数emplace_back()很好地体现了零拷贝技术,它跟push_back()函数一样可以将一个元素插入容器尾部,区别在于:使用push_back()函数需要调用拷贝构造函数和转移构造函数,而使用emplace_back()插入的元素原地构造,不需要触发拷贝构造和转移构造,效率更高。

那我们动手比较一下:

先看push_back()

#include<bits/stdc++.h>
using namespace std;
int main()
{
    clock_t start,finish;
    int times=20,cnt=10000000;
    int sum=0;
    for(int i=0;i<times;i++)
    {
        start=clock();
        vector<int> vec;
        for(int i=0;i<cnt;i++)
            vec.push_back(1);
        finish=clock();
        double tmp=(double)(finish-start)/CLOCKS_PER_SEC;
        cout<<"cost of time/ms:"<<tmp*1000<<endl;
        sum+=tmp*1000;
    }
    cout<<"the average time:"<<sum/times<<endl;
   return 0;
}

运行结果:

再看emplace_back()

#include<bits/stdc++.h>
using namespace std;
int main()
{
    clock_t start,finish;
    int times=20,cnt=10000000;
    int sum=0;
    for(int i=0;i<times;i++)
    {
        start=clock();
        vector<int> vec;
        for(int i=0;i<cnt;i++)
            vec.emplace_back(1);
        finish=clock();
        double tmp=(double)(finish-start)/CLOCKS_PER_SEC;
        cout<<"cost of time/ms:"<<tmp*1000<<endl;
        sum+=tmp*1000;
    }
    cout<<"the average time:"<<sum/times<<endl;
   return 0;
}

 运行结果:

结论:我粗略算了一下,empalce_back()性能大概提升了20% 

最后

以上就是风趣裙子为你收集整理的关于emplace_back()和push_back()的比较的全部内容,希望文章能够帮你解决关于emplace_back()和push_back()的比较所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部