copy-elision相关内容

复制省略和简单的可复制类型

从标准的6.7.7(临时对象)中可以看到: 当将类类型X的对象传递到函数或从函数返回时,如果X至少有一个合格的复制或移动构造函数([特殊]),每个这样的构造函数都是平凡的,并且X的析构函数要么是平凡的,要么是删除的,则允许实现创建一个临时对象来保存函数参数或结果对象。临时对象分别从函数实参或返回值构造,函数的参数或返回对象被初始化,就像使用符合条件的普通构造函数复制临时对象一样(即使该构造函 ..
发布时间:2022-05-17 11:12:26 C/C++开发

复制省略用于列表初始化,它在标准中规定在哪里?

[dcl.init]/17.6中明确写到,初始化圆括号时,会发生副本省略: 如果初始化器表达式是prvalue,并且源类型的cv非限定版本与目标的类相同,则初始化器表达式用于初始化目标对象。[ 示例:T x=T());调用T默认构造函数初始化x。 - 结束示例 ] 但是在列表初始化的情况下(上面的段落不适用),我没有发现任何类似的东西。请参见[dcl.init.list]。 那么 ..

C 中的返回值优化和复制省略

有些人不知道可以传递和返回结构体按 C 中的值.我的问题是关于编译器在 C 中返回结构时制作不必要的副本. GCC 等 C 编译器是否使用 返回值优化(RVO) 优化还是仅 C++ 的概念?我所读到的关于 RVO 和复制省略的所有内容都与 C++ 有关. 让我们考虑一个例子.我目前正在 C 中实现 双双数据类型(或者更确切地说是 float-float 开始,因为我发现单元测试很容易).考虑 ..
发布时间:2021-12-23 17:18:18 C/C++开发

什么是复制省略以及它如何优化复制和交换习语?

我正在阅读复制和交换. 我尝试阅读 Copy Elision 上的一些链接,但无法正确理解它的含义.有人可以解释一下这个优化是什么,特别是下面的文字是什么意思 这不仅仅是一个方便的问题,而且实际上是一种优化.如果参数 (s) 绑定到左值(另一个非常量对象),则在创建参数 (s) 时会自动制作该对象的副本.但是,当 s 绑定到右值(临时对象,文字)时,通常会省略副本,从而节省对复制构造函 ..
发布时间:2021-12-20 15:53:05 C/C++开发

保证复制省略如何工作?

在 2016 年奥卢 ISO C++ 标准会议上,一项名为 Func()的返回值是一个等价于T()的纯右值,t直接被T(),就像你完成了T t = T(). 如果以任何其他方式使用纯右值,则纯右值将具体化一个临时对象,该对象将在该表达式中使用(如果没有表达式,则将其丢弃).因此,如果您执行 const T &rt = Func();,纯右值将实现一个临时的(使用 T() 作为初始化程序),其 ..
发布时间:2021-12-01 15:03:19 C/C++开发

什么是复制省略和返回值优化?

什么是复制省略?什么是(命名的)返回值优化?它们意味着什么? 它们会在什么情况下发生?什么是限制? 如果有人提到过这个问题,您可能正在寻找简介. 有关技术概述,请参阅标准参考. 请参阅常见案例此处. 解决方案 简介 有关技术概述 - 跳至此答案. 对于发生复制省略的常见情况 - 跳至此答案. 复制省略是大多数编译器实现的优化,用于在某些情况下防止额外的(可 ..

从函数中正确传播 `decltype(auto)` 变量

(这是 "`decltype(auto)` 变量是否有任何实际用例?") 考虑以下场景 - 我想将一个函数 f 传递给另一个函数 invoke_log_return 它将: 调用f; 打印一些东西到stdout; 返回f的结果,避免不必要的复制/移动并允许复制省略. 请注意,如果 f 抛出,则不应向 stdout 打印任何内容.这是我目前所拥有的: template ..
发布时间:2021-11-30 18:22:09 C/C++开发

为什么复制省略对形式参数有例外?

这是一个完整的程序: #include 使用 std::cout;使用 std::endl;使用 std::move;整数计数{0};//全局监控三重类{民众:三重()=默认;//C++11 使用默认构造函数,尽管声明了其他构造函数Triple(Triple&&) = 默认值;Triple(const Triple& t) ://复制构造函数三重(t.mX,t.mY,t.mZ){计数++;}三重 ..
发布时间:2021-09-18 18:59:42 C/C++开发

任何编译器实际上会忽略这些副本吗?

给定 struct Range{Range(double from, double to) : from(from), to(to) {}双从;双到;//如果这对编译器很重要,我们可以在此处添加更多字段以使复制成本高昂};结构框{框(范围x,范围y):x(x),y​​(y){}范围 x;范围 y;}; 有人说在Box box(Range(0.0,1.0),Range(0.0,2.0)),编译器 ..
发布时间:2021-06-14 19:53:53 C/C++开发

括号中带有return语句的C ++ nrvo/copy省略

我正在鬼混以下代码,并使用我的visual studio 2017应用程序和两个不同的在线编译器获得了不同的结果.在发布模式下,Visual Studio在两种情况下都不会执行复制/移动操作,而两个在线编译器只会在未加括号的return语句中执行复制/移动操作.我的问题是:谁是正确的,更重要的是底层规则是什么?(我知道您可以将括号与 decltype(auto)语法结合使用.但这不是当前用例.) ..
发布时间:2021-05-28 20:17:06 C/C++开发

在emplace()中创建对象时复制省略号

我看到许多工作中的代码,其中人们将emplace和emplace_back与一个临时对象一起使用,如下所示: 结构A {A :: A(int,int);};向量Av;向量 .emplace_back(A(1,2)); 我知道emplace_back的全部要点是能够直接传递参数,如下所示: v.emplace_back(1,2); 但是不幸的是,这对一些人来说还不清楚.但是,我 ..
发布时间:2021-04-20 18:55:33 C/C++开发

是否可以确保复制省略?

复制删除是一种整洁的优化技术,在某些情况下,它依赖于复制删除实际上比手动传递引用要快“. 因此,假设您已经确定了关键代码路径,您可以依靠以下事实来进行编译:复制省略是由编译器为代码路径执行的,以实现最佳性能. 但是现在您要依靠编译器优化. 是否有任何方法(显然是特定于编译器的)来确保实际上执行了复制删除操作,并且如果无法执行复制删除操作,则使编译器(或其他工具)生成警告/错误? ..
发布时间:2021-04-19 19:58:56 C/C++开发

复制初始化:即使关闭了复制删除功能,为何仍未调用move或copy构造函数?

我的问题有所不同,因为我可能“知道"复制删除.我正在学习复制初始化.但是,以下代码使我感到困惑,因为我已经使用-fno-elide-contructors -O0选项关闭了复制删除功能. #include using namespace std; class test{ public : test(int a_, int b_) : a{a_}, b{b_} { ..

按值传递和复制省略优化

我看到了文章 http://cpp-next.com / archive / 2009/08 / want-speed-pass-by-value / 作者建议: 不要复制函数参数。相反,按值传递它们,然后 让编译器执行复制。 但是,我不太了解在文章中提供的两个示例中可以获得收益: //不要 T& T :: operator =(T const& x)// x是对源 ..
发布时间:2020-10-06 23:29:49 C/C++开发

从工厂功能就地初始化不可复制的成员(或其他对象)

一个类必须具有有效的副本或移动构造函数,此语法中的任何一种才合法: C x = factory (); C y(factory()); C z {factory()}; 在C ++ 03中,很常见的情况是依靠复制省略来防止编译器接触到复制构造函数。每个类都有一个有效的副本构造函数 signature ,无论是否存在定义。 在C ++ 11中,不可复制类型 ..
发布时间:2020-09-27 20:14:48 C/C++开发