其他分享
首页 > 其他分享> > c – 在emplace()中创建对象时复制elision

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