首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在不使用函数时,从函数返回的对象是否仍然是创建的?

在不使用函数时,从函数返回的对象是否仍然是创建的?
EN

Stack Overflow用户
提问于 2018-02-14 08:26:22
回答 2查看 1.9K关注 0票数 19

请考虑以下代码。当调用doStuff()但不使用返回值时,会发生什么情况?SomeClass还在创建吗?当然,创建本身可能有重要的副作用,但是复制构造函数也是如此,它们仍然在RVO /复制省略中被忽略。

代码语言:javascript
运行
复制
SomeClass doStuff(){
    //...do stuff
    return SomeClass( /**/);
}

SomeClass some_object = doStuff();
doStuff(); //What happens here?

(编辑:用GCC -O3测试。该对象被构造,然后立即销毁)

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-02-14 08:34:13

当涉及到RVO和复制省略时,我觉得有一个误解。这并不意味着函数的返回值不被创建。它总是被创建的,这并不是一个实现可以避免的事情。

唯一的回旋余地,当涉及到精细化复制,尽管有副作用,是与削减中间的人。当您用调用的结果初始化对象时,标准允许插入目标对象,以便函数直接初始化。

如果不提供目标对象(通过使用结果),则必须将临时对象物化并销毁,作为包含函数调用的完整表达式的一部分。

因此,让我们来看看你的例子:

代码语言:javascript
运行
复制
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.
票数 22
EN

Stack Overflow用户

发布于 2018-02-14 11:48:20

在某些情况下,编译器可能会删除不必要的副本,即使它有副作用,是的。

如果一个对象有副作用,编译器可能不会删除对象的全部存在。

如果它没有副作用,那么没有任何结果是可以观察到的,所以它的存在是否确实是一个没有问题的问题。

博士:标准列出了非常具体的筛选机会,而这不是其中之一。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48782639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档