请考虑以下代码。当调用doStuff()但不使用返回值时,会发生什么情况?SomeClass还在创建吗?当然,创建本身可能有重要的副作用,但是复制构造函数也是如此,它们仍然在RVO /复制省略中被忽略。
SomeClass doStuff(){
    //...do stuff
    return SomeClass( /**/);
}
SomeClass some_object = doStuff();
doStuff(); //What happens here?(编辑:用GCC -O3测试。该对象被构造,然后立即销毁)
发布于 2018-02-14 08:34:13
当涉及到RVO和复制省略时,我觉得有一个误解。这并不意味着函数的返回值不被创建。它总是被创建的,这并不是一个实现可以避免的事情。
唯一的回旋余地,当涉及到精细化复制,尽管有副作用,是与削减中间的人。当您用调用的结果初始化对象时,标准允许插入目标对象,以便函数直接初始化。
如果不提供目标对象(通过使用结果),则必须将临时对象物化并销毁,作为包含函数调用的完整表达式的一部分。
因此,让我们来看看你的例子:
doStuff(); // An object is created and destroyed as part of temporary materialization
           // Depending on the compilers analysis under the as-if rule, there may be
           // further optimization which gets rid of it all. But there is an object there 
           // formally.
std::rand() && (doStuff(), std::rand());
// Depending on the result of std::rand(), this may or may not create an object.
// If the left sub-expression evaluates to a falsy value, no result object is materialized.
// Otherwise, one is materialized before the second call to std::rand() and 
// destroyed after it.发布于 2018-02-14 11:48:20
在某些情况下,编译器可能会删除不必要的副本,即使它有副作用,是的。
如果一个对象有副作用,编译器可能不会删除对象的全部存在。
如果它没有副作用,那么没有任何结果是可以观察到的,所以它的存在是否确实是一个没有问题的问题。
博士:标准列出了非常具体的筛选机会,而这不是其中之一。
https://stackoverflow.com/questions/48782639
复制相似问题