copy-elision相关内容
从标准的6.7.7(临时对象)中可以看到: 当将类类型X的对象传递到函数或从函数返回时,如果X至少有一个合格的复制或移动构造函数([特殊]),每个这样的构造函数都是平凡的,并且X的析构函数要么是平凡的,要么是删除的,则允许实现创建一个临时对象来保存函数参数或结果对象。临时对象分别从函数实参或返回值构造,函数的参数或返回对象被初始化,就像使用符合条件的普通构造函数复制临时对象一样(即使该构造函
..
强制复制省略是否适用于通过结构化绑定的分解?这适用于以下哪些情况? // one auto [one, two] = std::array{SomeClass{1}, SomeClass{2}}; // two auto [one, two] = std::make_tuple(SomeClass{1}, SomeClass{2}); // three struct
..
[dcl.init]/17.6中明确写到,初始化圆括号时,会发生副本省略: 如果初始化器表达式是prvalue,并且源类型的cv非限定版本与目标的类相同,则初始化器表达式用于初始化目标对象。[ 示例:T x=T());调用T默认构造函数初始化x。 - 结束示例 ] 但是在列表初始化的情况下(上面的段落不适用),我没有发现任何类似的东西。请参见[dcl.init.list]。 那么
..
有些人不知道可以传递和返回结构体按 C 中的值.我的问题是关于编译器在 C 中返回结构时制作不必要的副本. GCC 等 C 编译器是否使用 返回值优化(RVO) 优化还是仅 C++ 的概念?我所读到的关于 RVO 和复制省略的所有内容都与 C++ 有关. 让我们考虑一个例子.我目前正在 C 中实现 双双数据类型(或者更确切地说是 float-float 开始,因为我发现单元测试很容易).考虑
..
我正在阅读复制和交换. 我尝试阅读 Copy Elision 上的一些链接,但无法正确理解它的含义.有人可以解释一下这个优化是什么,特别是下面的文字是什么意思 这不仅仅是一个方便的问题,而且实际上是一种优化.如果参数 (s) 绑定到左值(另一个非常量对象),则在创建参数 (s) 时会自动制作该对象的副本.但是,当 s 绑定到右值(临时对象,文字)时,通常会省略副本,从而节省对复制构造函
..
在 2016 年奥卢 ISO C++ 标准会议上,一项名为 Func()的返回值是一个等价于T()的纯右值,t直接被T(),就像你完成了T t = T(). 如果以任何其他方式使用纯右值,则纯右值将具体化一个临时对象,该对象将在该表达式中使用(如果没有表达式,则将其丢弃).因此,如果您执行 const T &rt = Func();,纯右值将实现一个临时的(使用 T() 作为初始化程序),其
..
什么是复制省略?什么是(命名的)返回值优化?它们意味着什么? 它们会在什么情况下发生?什么是限制? 如果有人提到过这个问题,您可能正在寻找简介. 有关技术概述,请参阅标准参考. 请参阅常见案例此处. 解决方案 简介 有关技术概述 - 跳至此答案. 对于发生复制省略的常见情况 - 跳至此答案. 复制省略是大多数编译器实现的优化,用于在某些情况下防止额外的(可
..
(这是 "`decltype(auto)` 变量是否有任何实际用例?") 考虑以下场景 - 我想将一个函数 f 传递给另一个函数 invoke_log_return 它将: 调用f; 打印一些东西到stdout; 返回f的结果,避免不必要的复制/移动并允许复制省略. 请注意,如果 f 抛出,则不应向 stdout 打印任何内容.这是我目前所拥有的: template
..
这是一个完整的程序: #include 使用 std::cout;使用 std::endl;使用 std::move;整数计数{0};//全局监控三重类{民众:三重()=默认;//C++11 使用默认构造函数,尽管声明了其他构造函数Triple(Triple&&) = 默认值;Triple(const Triple& t) ://复制构造函数三重(t.mX,t.mY,t.mZ){计数++;}三重
..
给定 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)),编译器
..
我正在鬼混以下代码,并使用我的visual studio 2017应用程序和两个不同的在线编译器获得了不同的结果.在发布模式下,Visual Studio在两种情况下都不会执行复制/移动操作,而两个在线编译器只会在未加括号的return语句中执行复制/移动操作.我的问题是:谁是正确的,更重要的是底层规则是什么?(我知道您可以将括号与 decltype(auto)语法结合使用.但这不是当前用例.)
..
我看到许多工作中的代码,其中人们将emplace和emplace_back与一个临时对象一起使用,如下所示: 结构A {A :: A(int,int);};向量Av;向量 .emplace_back(A(1,2)); 我知道emplace_back的全部要点是能够直接传递参数,如下所示: v.emplace_back(1,2); 但是不幸的是,这对一些人来说还不清楚.但是,我
..
复制删除是一种整洁的优化技术,在某些情况下,它依赖于复制删除实际上比手动传递引用要快“. 因此,假设您已经确定了关键代码路径,您可以依靠以下事实来进行编译:复制省略是由编译器为代码路径执行的,以实现最佳性能. 但是现在您要依靠编译器优化. 是否有任何方法(显然是特定于编译器的)来确保实际上执行了复制删除操作,并且如果无法执行复制删除操作,则使编译器(或其他工具)生成警告/错误?
..
我的问题有所不同,因为我可能“知道"复制删除.我正在学习复制初始化.但是,以下代码使我感到困惑,因为我已经使用-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是对源
..
背景: 请考虑以下示例: #include #include int main(){ std :: vector vectorBool {false,true}; for(const auto& element:vectorBool)std :: cout
..
如果我正确理解,从C ++ 17开始,此代码现在要求不执行任何复制操作: Foo myfunc(void){ return Foo(); } auto foo = myfunc(); //没有副本 函数参数是否也正确? Foo myfunc(Foo foo){ return foo; } auto foo = myfunc(Foo());
..
一个类必须具有有效的副本或移动构造函数,此语法中的任何一种才合法: C x = factory (); C y(factory()); C z {factory()}; 在C ++ 03中,很常见的情况是依靠复制省略来防止编译器接触到复制构造函数。每个类都有一个有效的副本构造函数 signature ,无论是否存在定义。 在C ++ 11中,不可复制类型
..
考虑以下代码: #include 使用命名空间std; 结构Foo { public: int _a {}; Foo(int a):_a {a} { std :: cout
..
考虑以下代码: #include struct事物 { 事物(void){std :: cout
..