C++中push_back和emplace_back的区别

  • Post author:
  • Post category:其他



  1. push_back()

    将一个字符串复制到一个向量中。首先,将隐式创建一个新的字符串对象,并使用提供的 char* 进行初始化。然后 push_back 将被调用,它将使用移动构造函数将此字符串复制到向量中,因为原始字符串是一个临时对象。然后临时对象将被销毁。

  2. emplace_back()

    就地构造一个字符串,因此不会创建临时字符串,而是直接使用 char* 参数调用 emplace_back()。然后它会创建一个字符串来存储在用这个 char* 初始化的向量中。因此,在这种情况下,我们避免构造和销毁不必要的临时字符串对象。



    emplace_back


    函数的作用是减少对象拷贝和构造次数,是C++11中的新特性,在效率上相比较于

    p

    ush_back()


    有了一定的提升。包括在内存优化方面和运行效率方面。内存优化主要体现在使用了

    就地构造(直接在容器内构造对象,不用拷贝一个复制品再使用)+强制类型转换

    的方法来实现,在运行效率方面,由于省去了拷贝构造过程,因此也有一定的提升。


以此为例:


先用

push_back(),可见

在push_back之前,必须使用stu_info实例一个临时对象传入才行,实例对象就必须要执行构造函数,然后拷贝到容器中再执行一次拷贝构造函数。

#include <iostream>
#include <vector>

using namespace std;
class stu_info {
private:
    string name;
public:
    stu_info(const string &name) {
        this->name = name;
        cout << "stu_info(): " << this->name << endl;
    }

    ~stu_info() {
        cout << "~stu_info(): " << this->name << endl;
    }

    stu_info(const stu_info &s) {
        this->name = s.name;
        cout << "copy constructor: " << this->name << endl;
    }
};

int main()
{
    vector<stu_info> v;
    v.push_back(stu_info("nginx"));
    return 0;
}


执行结果:


再用emplace_back可见不用执行多余的拷贝构造函数了,它是直接在容器内执行对象的构造。

int main()
{
    vector<stu_info> v;
    v.emplace_back("redis");
    return 0;
}


执行结果:




版权声明:本文为jikenvhai原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。