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