我在工作中看到很多代码,人们将 emplace 和 emplace_back 与临时对象一起使用,如下所示:
struct A {
A::A(int, int);
};
vector<A> v;
vector<A>.emplace_back(A(1, 2));
我知道 emplace_back 的全部意义在于能够直接传递参数,如下所示:
v.emplace_back(1, 2);
但不幸的是,少数人并不清楚这一点。但我们不要纠缠于此......
我的问题是:编译器是否能够对此进行优化并跳过创建和复制?或者我真的应该尝试解决这些问题吗?
供您参考...我们正在使用 C++14。
我的问题是:编译器是否能够对此进行优化并跳过创建和复制?或者我真的应该尝试解决这些问题吗?
一般情况下,它无法避免副本。自从emplace_back
通过转发引用接受,它必须从纯粹的标准角度创建临时文件。毕竟,这些引用必须绑定到对象。
复制省略是一组规则,允许避免复制(或移动)构造函数,并省略复制,即使构造函数和相应的析构函数有副作用。它仅适用于特定情况。通过引用传递参数不是其中之一。因此,对于非平凡类型,对象副本无法通过 as-if 规则内联,如果编译器的目标是符合标准,那么编译器的双手就会受到限制。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)