不能盲目地将std::vector的push_back替换为emplace_back

一般来说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(构造参数))

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值