lambda对象的构建成本是否很高?

时间:2018-05-15 09:33:22

标签: c++ performance lambda

出于某种目的,可以在频繁的被调用者函数中声明一个仿函数。构造函数的构造是否会花费很多,或者只是与定义一个简单的结构相当?

void f() {
    static int x = 0;
    auto a = [&](){ x += 1;};
    for (auto i = 0, i < 10; ++i) {
        a();
    }
}

// somewhere else call f thousands of times
f()

修改更新了示例代码。

2 个答案:

答案 0 :(得分:5)

lambda一般都很便宜。

SomeType var;
auto lambda = [var](){ /* ... */ }

这里,lambda只是匿名类型的一个实例。类型本身在编译时处理,所以不用担心。然而,在运行时发生的是捕获变量(这里是var)。捕获按值完成时,值本身将复制到lambda实例中。这就是成本。当通过引用完成捕获时,引用将被复制到lambda中,这很便宜。

有关您的信息,显示的代码相当于:

SomeType var;
struct anonymous {
    anonymous(SomeType st) : st(st) {}
    void operator()() { /* .... */ }
private:
    SomeType st;
} lambda(var);

答案 1 :(得分:1)

答案一如既往:取决于。

根据lambda的样子,编译器可能会将其变成函数指针,或者只是内联它。对于更复杂的东西,建筑成本将类似于结构。

您应该始终衡量您针对特定用例获得的性能。