2012-10-27 34 views
3

假设创建一个类,并返回一个函数:以下两种方法是否返回C++对象?

Foo getFoo() 
{ 
    return Foo ("bar"); 
} 

而第二种方法:

Foo getFoo() 
{ 
    Foo foo ("bar"); 
    return foo; 
} 

现在我把它与const Foo & myFoo = getFoo()

是第一种方法更有效?他们看起来和我一样,因为他们都创建了一个临时变量并返回它,我错了吗?

+1

在C++ 11中也考虑'return {“bar”};'。 –

+4

@sftrabbit仅当Foo的构造函数不是'explicit'时 – Praetorian

+0

@sftrabbit:聪明的技巧;但不是一个好主意。明确表示将使代码更易于阅读和维护以供未来的编码人员使用。 –

回答

4

它们基本上是一样的,虽然第一个中的复制elision被称为“返回值优化”(RVO),而第二个中的复制elision将被称为“命名返回值优化”(NRVO)。有一段时间编译器可以执行RVO,但不能执行NRVO。

+0

它也可能取决于优化级别,例如我似乎记得MSVC不会在调试版本中执行NRVO。 –

相关问题