考虑以下代码:
// 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 之间可能没有可衡量的差异。
关于c++ - Lambda 构造性能和静态 lambda?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34011065/