考虑以下代码:

// 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,以-O1LIVE开头):
main:
    movl    %edi, %eax
    imull   %edi, %eax
    ret

如您所见,没有任何lambda等的残余。它是完全内联的。

尽管您的特定用例可能需要更多分析,但静态和非静态Lambda之间可能没有可测量的差异。

08-26 09:35