-
push_back()
将一个字符串复制到一个向量中。首先,将隐式创建一个新的字符串对象,并使用提供的 char* 进行初始化。然后 push_back 将被调用,它将使用移动构造函数将此字符串复制到向量中,因为原始字符串是一个临时对象。然后临时对象将被销毁。 -
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 版权协议,转载请附上原文出处链接和本声明。