首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >只有当emplace对象是非POD和r值时,emplace才优于push吗?

只有当emplace对象是非POD和r值时,emplace才优于push吗?
EN

Stack Overflow用户
提问于 2021-03-10 01:31:42
回答 1查看 45关注 0票数 0

从我读到的关于STL容器的emplacepush的比较中,只有当你放置的对象是r值和非POD类型时,emplace相对于push的好处才是明显的。这是emplace速度更快的唯一情况吗?

EN

回答 1

Stack Overflow用户

发布于 2021-03-10 02:04:13

emplace函数用于将尚不存在的对象插入到容器中。也就是说,在考虑使用emplace的地方,您应该拥有对象构造函数的参数,因此您要在insert/push_back(Typename(...))emplace/_back(...)之间进行选择,其中...是构造函数的参数。

如果您正在处理的对象已经存在(无论是左值还是右值),那么选择哪一个实际上并不重要。你必须从它复制/移动,这两个替代方案都可以很好地处理这些情况。

就地构造的效用实际上与类型是微不足道的、POD的还是仅移动的无关。这一切都是关于就地构造对象的。如果您有能力进行就地构造(即:您还没有对象),那么您应该更愿意这样做。

给定一些BigObject容器,emplace_back(args)将比push_back(BigObject(args))更好。这不是BigObject的移动能力或琐碎或者是POD的函数。这是BigObject变大的函数;也就是说,sizeof(BigObject)很重要。因此,复制/移动的成本可能很高,所以原地构造它比作为参数传递更有意义。

不,有保证的省略不会有帮助。push_back为其参数命名,因此它不再是push_back中的prvalue。因此,它必须物化临时对象,然后将其复制/移动到容器的对象中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66551916

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档