什么是“返回obj(值);返回?

时间:2011-03-06 20:21:09

标签: c++ return

return obj(value);返回什么?返回它是新构造的对象还是它的副本?

我之所以问: 是

return obj(value);

更有效率
temp = obj(value); 
return temp;

跟进:如果是这样,它真的有区别,还是编译器优化了它?

3 个答案:

答案 0 :(得分:2)

返回语句总是返回参数对象的副本,但有一个例外:当函数返回引用时,引用可能会附加到{{1}的参数直接,在这种情况下,当然没有复制。

出于这个原因,从您的案例的迂腐角度来看,没有办法说明会发生什么,因为我们不知道使用return的函数的签名。它是否返回引用?

如果我们假设函数返回一个非引用类型(这可能是你暗示的那个),那么,在这两种情况下都会返回一个副本。在第二种情况下,您还可以在return对象中创建一个额外的副本。因此,从抽象的角度来看,第二个变体会产生一个额外的副本,因此“慢”。但是,C ++语言允许在这种情况下进行相当深远的优化。阅读有关RVO(返回值优化)和NRVO(命名返回值优化)的信息。由于这些优化,实际上两个变体实际上可能会生成相同的代码,显然,它们同样有效。

最后,它归结为您的特定编译器将能够生成的代码。如果您想知道哪个更快,请使用特定的编译器和特定的编译器设置。或者检查生成的机器代码。

答案 1 :(得分:0)

效率不高。它将新创建的值作为副本返回。但在这两种情况下,编译器都可能优化返回值。

答案 2 :(得分:0)

什么是返回obj(值);返回?

对象

返回新构造的对象或其副本吗?

取决于编译器。

更有效率

没有

但是,一旦我们向编译器添加优化,故事就会改变。 NRVO和RVO是不同的优化。编译器可以应用一个而不是另一个。