push_back():
push_back()向容器末尾添加元素时,首先会创建这个元素,然后再将这个元素拷贝或者移动到容器中。
emplace_back():
emplace_back()向容器末尾添加元素时,直接在容器内部构造这个元素,而不是先构造一个对象再拷贝或移动到容器中。在底层实现时,emplace_back()的参数会被转发到容器内部新元素的构造函数中。这意味着元素的构造直接在容器的内存位置上进行,避免了不必要的复制或移动操作。
总结:
push_back() -> 构造 + 拷贝构造 / 构造 + 移动 。
emplace_back() -> 构造 。
#include <iostream>
#include <vector>
using namespace std;
class Test
{
public:
Test(int num):_num(num) { cout << "构造"; }
Test(const Test& t) :_num(t._num) { cout << "+拷贝构造" << endl; }
Test(Test&& t) :_num(t._num) { cout << "+移动构造" << endl; }
private:
int _num;
};
int main()
{
vector<Test> t1;
vector<Test> t2;
cout << "emplace_back():" << endl;
t1.emplace_back(1);
cout << endl;
cout << "push_back():" << endl;
t2.push_back(2);
return 0;
}
运行结果:
emplace_back():
构造
push_back():
构造+移动构造
如果将移动构造注释掉,运行结果如下:
emplace_back():
构造
push_back():
构造+拷贝构造
所以,得出结论:在移动构造和拷贝构造都可以使用的情况下,优先使用移动构造。