一般来说emplace_back
的性能是会比push_back
好的,因为emplace_back
仅需要调用构造函数;而push_back
会调用构造函数和拷贝(或移动)构造函数,多了拷贝(或移动)构造的时间。
#include <iostream>
#include <vector>
class Foo{
public:
Foo(){
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
~Foo(){
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
Foo(const Foo& rhs){
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
Foo(const Foo&& rhs) noexcept {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
void operator()() const {
std::cout << __PRETTY_FUNCTION__ << std::endl;
}
};
int main() {
std::vector<Foo> vec1;
vec1.push_back(Foo()); // Foo::Foo()
// Foo::Foo(const Foo&&)
// Foo::~Foo()
std::cout << std::string(40, '-') << std::endl;
std::vector<Foo> vec2;
vec2.emplace_back(); // Foo::Foo()
std::cout << std::string(40, '-') << std::endl;
}
输出:
Foo::Foo()
Foo::Foo(const Foo&&)
Foo::~Foo()
----------------------------------------
Foo::Foo()
----------------------------------------
Foo::~Foo()
Foo::~Foo()
可以看到push_back
调用了构造函数、移动构造,而emplace_back
只调用了构造函数。
push_back
将一个已存在的对象拷贝或移动到vector
里。emplace_back
是利用构造函数所需的参数将对象构造出来,只有调用构造函数的开销。
使用push_back
还是emplace_back
的建议:
如果push_back
的对象是已经存在的,则不建议盲目将push_back
替换为emplace_back
。因为emplace_back
可能会引起不必要的二进制膨胀。
如果对象是新创建的,则可以考虑将push_back(Obj(构造参数))
改为emplace_back(Obj(构造参数))
。