Named Return Value Optimization 具名返回值优化
问题描述 :
当一个函数返回一个对象的实例,一个临时对象被创建并通过拷贝构造函数传回其值。 C++ 标准允许省略拷贝构造函数的对象(即使会导致程序结果的不一致)。
前提是所有的路径返回相同的对象。
问题由来:
看如下的函数:
X bar() {
X xx;
//… 处理 xx
return xx;
}
如果看到了这篇文章,大概应该知道编译期面对这个函数会做如下的转化:
//Pseudo C++ Code
void bar( X &__result ) {
X xx;
xx.X::X(); //default constructor
// .. 处理 xx
__result.X::X( xx ); // copy constructor
return;
}
如上述 bar() 这样,所有的路径都返回相同的具名数值 (Named Value) ,因此编译器可以做自己的优化。以 __result 取代 Named Return Valued 。
//Pseudo C++ Code
void bar( X &__result ) {
__result.X::X(); //default constructor
// .. 处理 xx
return;
}
编译器呢?
B.Lippman 的 Inside the C++ Object Model 一书中如是说 :
NRV 优化如今被视为标准 C++ 编译器的一个义不容辞的优化操作。真的如此吗?
其实 Visual C++ 熬到了 8.0 才支持了 Named Return Value Optimization 。
实际的例子:
以下例子均是在 VS2010 beta2 中测得。
#include <ctime>
#include