c – 在emplace()中创建对象时复制elision
作者:互联网
我看到很多代码在工作中人们使用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.
解决方法:
My question is: is the compiler able to optimize this and skip the create and copy? Or should I really try to fix these occurrences?
在一般情况下,它无法避免副本.由于emplace_back通过转发引用来接受,因此它必须从纯粹的标准角度创建临时值.毕竟,这些引用必须绑定到对象.
复制省略是一组规则,允许避免复制(或移动)构造函数,并且复制省略,即使构造函数和相应的析构函数具有副作用.它仅适用于特定情况.通过引用传递参数不是其中之一.因此,对于非平凡类型,其中对象副本不能通过as-if规则进行内联,如果编译器的目标是符合标准,则编译器的指针是绑定的.
标签:copy-elision,c,c14 来源: https://codeday.me/bug/20190910/1799164.html