C++中push_back和emplace_back的区别

  1. push_back()将一个字符串复制到一个向量中。首先,将隐式创建一个新的字符串对象,并使用提供的 char* 进行初始化。然后 push_back 将被调用,它将使用移动构造函数将此字符串复制到向量中,因为原始字符串是一个临时对象。然后临时对象将被销毁。
  2. emplace_back()就地构造一个字符串,因此不会创建临时字符串,而是直接使用 char* 参数调用 emplace_back()。然后它会创建一个字符串来存储在用这个 char* 初始化的向量中。因此,在这种情况下,我们避免构造和销毁不必要的临时字符串对象。

    emplace_back函数的作用是减少对象拷贝和构造次数,是C++11中的新特性,在效率上相比较于 push_back() 有了一定的提升。包括在内存优化方面和运行效率方面。内存优化主要体现在使用了就地构造(直接在容器内构造对象,不用拷贝一个复制品再使用)+强制类型转换的方法来实现,在运行效率方面,由于省去了拷贝构造过程,因此也有一定的提升。

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

#include 
#include 

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 v;
    v.push_back(stu_info("nginx"));
    return 0;
}

执行结果:C++中push_back和emplace_back的区别_第1张图片

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

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

执行结果:C++中push_back和emplace_back的区别_第2张图片

 

 

你可能感兴趣的:(C++,c++)