c++ - Lambda 构造性能和静态 lambda?

标签 c++ performance c++11 lambda static

考虑以下代码:

// 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/

相关文章:

c++ - 通过函数参数而不是模板参数获取元组的元素

c++ - 不确定 Dekkers 算法做错了什么

c# - List<T>.AddRange 实现次优

函数内定义的 Python 编译器和常量

XML 解析性能 Scala

c++ - 从 vector 私有(private)继承,公开相等运算符

c++ - 在 win32 中绘制像素最快的方法是什么

c++ - 多线程减慢程序 : no False-sharing, 没有互斥锁,没有缓存未命中,工作量不小

c++ - map 、集合等的 array_view 替代方案

c++ - 在 C++0x 中,非静态数据成员初始化器会覆盖隐式复制构造函数吗?