考虑以下代码:
// Classic version
template <class It>
It f(It first, It last)
{
using value_type = It::value_type;
auto lambda = [](value_type x){return x > 10 && x < 100;};
return std::find_if(first, last, lambda);
}
// Static version
template <class It>
It f(It first, It last)
{
using value_type = It::value_type;
static auto lambda = [](value_type x){return x > 10 && x < 100;};
return std::find_if(first, last, lambda);
}
两者之间是否有任何性能差异? lambda函数的构造时间是多少?静态版本在性能方面是否更好,因为lambda仅构造一次?
最佳答案
构造一个无捕获的lambda类似于构造一个空的struct
。现代的编译器应该能够完全优化它。
例如,请参见此简单程序的程序集输出:
int main(int argc, const char* argv[])
{
auto l = [](int i){ return i*i; };
return l(argc);
}
汇编(gcc 5.2.0,以
-O1
,LIVE开头):main:
movl %edi, %eax
imull %edi, %eax
ret
如您所见,没有任何lambda等的残余。它是完全内联的。
尽管您的特定用例可能需要更多分析,但静态和非静态Lambda之间可能没有可测量的差异。