初识"返回值优化"

初识"返回值优化"
在<C++编程思想>2th中文版 第12.3.3.2节“返回值优化”中说,对于处理“return Integer(left.i + left.i);”这种的返回时,编译器直接在目的内存中创建,且因为不是创建局部对象,故可直接调用普通构造函数,而不需要复制构造函数;但,对于

Integer temp;
return temp;

这样的返回值形式,是需要调用复制构造函数来在目标内存中创建对象的。

我在VC2005中试了如下的小函数,

X f()
{
    X one(
5 );
    
// return one;  // 因为VC中默认情况下debug模式优化被禁止;release模式优化可用,所以在release模式下直接将one的定义目标内存中;debug则是调用复制构造在目标内存中构造
    
// return X(4);  //  release & debug 都直接在目标内存中构造对象
}

int  main()
{
   X test 
=  f();
}

对于,
Integer temp;
return temp;
这种形式,在VC2005中,如果没有禁用优化,则不要求复制构造函数可访问,也就是说复制构造函数都不会被调用。
但标准中说:“Even when the creation of the temporary object is avoided (12.8), all the semantic restrictions must be respected as if the temporary object was created. [ Example: even if the copy constructor is not called, all the semantic restrictions, such as accessibility (clause 11), shall be satisfied.]”,所以还是保留复制构造函数的可访问性吧。

P.S. : 后来了解到VC中(或者说标准允许)对命名对象的返回采用“命名返回值优化(NRVO)”来进行优化,但是对于这种优化只有在某些编译器选项开启后才得以实现,至少VC是这样的。

2009.6.18 更新

你可能感兴趣的:(初识"返回值优化")