c++ emplace_back 和push_back使用对比,笔记

如果对象已经存在,那么使用emplaceback 和pushback是一样的。
且都会调用拷贝构造

auto a = A(1)
a.emplace_back(a); 

如果对象是临时对象,都会进行临时构建,并且使用都使用移动构造函数再构建一次,也是一样

a.emplace_back(A(1)); 

如果直接给参数
那么pushback会临时构造对象并且使用移动构造到vector中
emplaceback会直接构建,只会构建一次。且如果只使用参数构造,pushback只能接受1个参数隐士构造,emplceback接受多个构造参数显示构造,意味着如果你需要通过多个参数构造对象,似乎只能使用emplaceback。

a.emplace_back(1,2,3);  // 可
a.push_back(1,2,3);  //编译不通过
a.push_back(1); // 可

所以,对于自定义资源型对象,那么要好好实现移动构造,编译器会优化到移动构造,需要你自己高效的实现

总结,c++ emplaceback 的语义可以翻译为原地构造,传一个已经存在的和pushback一样,并且都是拷贝。如果确定是亡值,手动使用stdmove可以触发移动构造,此时两者都一样
pushback似乎总是会进行两次构造

如果已经存在,使用push
如果直接用参数构建,使用emplace

最后贴一个tongyiqianwen的图,对比了一下,看起来它比gpt3.5(都回答错了)靠谱很多,看起来说得也是对的,需自行考究。
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值