代码之家  ›  专栏  ›  技术社区  ›  johnnyodonnell

在其他函数或循环中构造lambda时是否存在性能问题?

  •  3
  • johnnyodonnell  · 技术社区  · 7 年前

    Mozilla recommends 如果不需要闭包,则不应在其他函数内创建函数,因为这会对脚本性能产生负面影响。在JavaScript中,当在循环内部创建函数时,同样的问题也适用。同样的关注是否适用于C++ LAMBDAS?

    例如,这两个功能之间是否存在性能差异:

    int f1(vector<int> v) {
        for_each(v.begin(), v.end(), [](int i) { cout << i << endl; });
    }
    
    auto print_int = [](int i) { cout << i << endl; };
    int f2(vector<int> v) {
        for_each(v.begin(), v.end(), print_int);
    }
    

    f2 将比 f1

    2 回复  |  直到 7 年前
        1
  •  3
  •   JVApen    7 年前

    不,是的。

    对于简单的lambda,这并不重要。这是因为lambda是运算符为()的类的简单缩写。

    相关元素是类具有构造函数。想象:

    std::map<std::string, std::string> m = create();
    auto lambda = [m]() { /* code */ };
    

    在循环中执行此捕获没有意义,因为您复制了许多不应该更改的字符串。 在这种情况下,通过引用捕获也可能有意义。

    我的建议是:和其他班一样。如果cheep需要构造,只需将其放置在您认为符合逻辑的位置。如果建造成本高,想想为什么这么贵,并考虑在可能的时候把它搬出去。

        2
  •  3
  •   SergeyA    7 年前

    不,在现实生活编译器中不会有性能差异,因为C++编译器可能会为两个函数产生完全相同的汇编代码。

    一般来说,您不应该将为脚本语言设计的指导原则应用于编译语言,因为它们在编译阶段发生的事情(因此对运行时性能没有影响)与在运行时发生的事情有很大的不同。

        3
  •  1
  •   srdjan.veljkovic    7 年前

    它取决于编译器,或者更确切地说,取决于它的优化器。

    如果它拿起,它就可以内联 print_int ,然后是 f1() f2() 都是一样的。

    如果没有,那么, f2() 可能会生成实际的函数调用(即 CALL 在x86汇编程序中),而 f1()

    但是,在任何情况下,都不太可能在每个过程中创建“lambda”。Lambda只是带有重载函数调用运算符的本地类对象的语法糖。

        4
  •  0
  •   user287107    7 年前

    不,我希望您的代码中的两个示例不会在速度上做出任何更改。对于编译器来说,这两个语句非常相似。

    std::function 作为lambda函数指针的包装器(例如。 What is the performance overhead of std::function? )