Ahem。在科学的利益,我已经掀起了一个小的测试程序来检查编译器是否elides副本或不:
#include <iostream>
#include <list>
using namespace std;
class Test
{
public:
Test() { cout<<"Construct\n"; }
Test(const Test& other) { cout<<"Copy\n"; }
Test& operator=(const Test& other) { cout<<"Assign\n"; return (*this); }
};
Test rvo() { return Test(); }
int main()
{
cout<<"Testing rvo:\n";
Test t = rvo();
cout<<"Testing list insert:\n";
list<Test> l;
l.push_back(Test());
}
下面是我的MSVC++输出2008:
Testing rvo:
Construct
Testing list insert:
Construct
Copy
对于调试版本和发布版本来说都是一样的:RVO的工作原理,临时对象传递并没有被优化。
如果我没有弄错,在C++ 0x标准中添加Rvalue references是为了解决这个问题。
你使用什么编译器?我相信这种情况通常会在较新的编译器中进行优化。 – 2010-04-05 18:27:48
您是否使用优化版本进行分析? – 2010-04-05 18:33:25
您需要使用发布版本进行测试。它可能在DEBUG模式下执行此操作,但在释放模式下使用RVO(返回值优化),从而消除了副本。 – Nate 2010-04-05 18:42:11