「返回值優化」的概念是否適用於C++編譯器中的lambda表達式?我知道它取決於編譯器和優化參數,但理論上可行嗎?Lambda表達式和RVO
順便說一句,有沒有人知道VS.NET 2013或更高版本中的這個問題?
「返回值優化」的概念是否適用於C++編譯器中的lambda表達式?我知道它取決於編譯器和優化參數,但理論上可行嗎?Lambda表達式和RVO
順便說一句,有沒有人知道VS.NET 2013或更高版本中的這個問題?
是的,這是可能的。你可以用一個小例子來證明它。
產生該輸出,當我編譯鐺和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可以幫助你。
但理論上可行嗎?
我看不到任何理由。 lamda的運行時編譯時間生成的結構與()
運算符重載。
意思是這樣的:
auto f = []{printf("hi");};
可能會被翻譯成
struct lambda<someID>{ void operator(){printf("hi");} };
auto f = lambda<someID>();
所以,沒有理由,如果編譯器認爲它可以優化的事情了RVO就不會在這裏工作。
RVO不適用於VS 2013?你有旗幟/ O2優化代碼的速度? https://msdn.microsoft.com/en-us/library/k1ack8f1.aspx – Pumkko
是的,但這是否意味着有RVO? –