You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已有实例时,C++中push_back与emplace_back的差异及使用选择

emplace_back() 与 push_back():已有对象场景的差异及使用建议

传入已有对象时的行为完全一致

当你传入一个已经存在的对象实例(比如你示例里的resource),emplace_back(resource)和push_back(resource)的行为没有任何区别:

  • 两者都会在vector分配好的内存空间里,直接调用MyType的拷贝构造函数,原地生成resource的副本。
  • 你之前纠正的认知是对的:push_back根本不会先默认构造一个实例再赋值,它从一开始就是通过拷贝构造完成元素添加的。

你的示例代码用C++代码块展示更清晰:

MyType resource = get_resource();
std::vector<MyType> a;
a.emplace_back(resource); // 调用拷贝构造,原地构造副本
a.push_back(resource);    // 同样调用拷贝构造,原地构造副本

要不要始终用emplace_back()?

emplace_back()的场景覆盖度确实更高:

  • 它既能像push_back()那样接收已有对象(触发拷贝/移动构造),也能直接传构造参数原地造新对象(省去临时对象的创建和拷贝开销)。
  • 性能上,emplace_back()永远不会比push_back()差,甚至在构造新对象时优势明显。

但push_back()也不是完全没用:

  • 可读性优先:当你明确要把一个现成的对象塞进容器时,push_back()的语义更直白——“把这个对象推去容器末尾”,而emplace_back()的感觉更像“在末尾造个新对象”,对新手来说前者意图更清晰。
  • 代码风格统一:如果维护的旧代码里全是push_back(),为了风格一致继续用也很合理。

总结下来:追求性能或者需要原地构造新对象时,选emplace_back();看重代码直观性,在添加已有对象时用push_back()也完全没问题。

内容的提问来源于stack exchange,提问作者LB2

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 05:50:03