2015-10-19 72 views
1

「返回值優化」的概念是否適用於C++編譯器中的lambda表達式?我知道它取決於編譯器和優化參數,但理論上可行嗎?Lambda表達式和RVO

順便說一句,有沒有人知道VS.NET 2013或更高版本中的這個問題?

+0

RVO不適用於VS 2013?你有旗幟/ O2優化代碼的速度? https://msdn.microsoft.com/en-us/library/k1ack8f1.aspx – Pumkko

+0

是的,但這是否意味着有RVO? –

回答

4

是的,這是可能的。你可以用一個小例子來證明它。

產生該輸出,當我編譯鐺和g ++與-O2選項以下代碼:

CTOR

所以,未印刷的 「拷貝」。這意味着沒有複製發生。

#include <iostream> 

class Test 
{ 
public: 
    Test() { std::cout << "Ctor\n";} 
    Test(const Test& t) 
    { 
     std::cout << "copy" << std::endl; 
    } 
}; 

int main() 
{  
    auto myLambda = []() 
    { 
     return Test(); 
    }; 

    Test t = myLambda(); 
} 

RVO適用於函數的返回值。一個lambda被編譯爲一個函子。所以,它仍然是一個功能。

至於它爲什麼不在VS中工作,也許這post可以幫助你。

+0

對不起,我沒有得到你...你怎麼確切地通過這個例子確定它被應用? –

+0

複製構造函數不是隻調用構造函數。所以沒有一個副本。 – Pumkko

+0

哦!非常感謝..那就是 –

0

但理論上可行嗎?

我看不到任何理由。 lamda的運行時編譯時間生成的結構與()運算符重載。

意思是這樣的:

auto f = []{printf("hi");}; 

可能會被翻譯成

struct lambda<someID>{ void operator(){printf("hi");} }; 
auto f = lambda<someID>(); 

所以,沒有理由,如果編譯器認爲它可以優化的事情了RVO就不會在這裏工作。