从我读到的关于STL容器的emplace与push的比较中,只有当你放置的对象是r值和非POD类型时,emplace相对于push的好处才是明显的。这是emplace速度更快的唯一情况吗?
发布于 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。因此,它必须物化临时对象,然后将其复制/移动到容器的对象中。
https://stackoverflow.com/questions/66551916
复制相似问题