已有实例时,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
相关产品推荐
相关产品推荐

