出于某种目的,可以在频繁的被调用者函数中声明一个仿函数。构造函数的构造是否会花费很多,或者只是与定义一个简单的结构相当?
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()
修改更新了示例代码。
答案 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的样子,编译器可能会将其变成函数指针,或者只是内联它。对于更复杂的东西,建筑成本将类似于结构。
您应该始终衡量您针对特定用例获得的性能。