我应该让lambdas是静态的吗?

我应该让lambdas是静态的吗?,lambda,c++11,Lambda,C++11,如果我有一个定义lambda的函数,那么每次调用该函数时是否都会“构造”lamda?我应该让它保持静止以防止这种情况发生吗 void func(int x) { static auto lambda = [&x](int y) -> bool { // ... }; } 不,不要将其设置为静态,因为它通过引用捕获局部变量 我不知道建造lambda的成本是多少。如果您怀疑这是性能问题:基准测试。哦,没错。如果它没有通过引用捕获变量怎么办?如果lamb

如果我有一个定义lambda的函数,那么每次调用该函数时是否都会“构造”lamda?我应该让它保持静止以防止这种情况发生吗

void func(int x)
{
    static auto lambda = [&x](int y) -> bool {
        // ...
    };
}

不,不要将其设置为静态,因为它通过引用捕获局部变量


我不知道建造lambda的成本是多少。如果您怀疑这是性能问题:基准测试。

哦,没错。如果它没有通过引用捕获变量怎么办?如果lambda足够大,可以让它成为一个全局函数,并将捕获的值作为附加参数传递。@Kerrek SB:它不大,我只是好奇。所有这些都是实现定义的,但明智的实现将使它对您来说尽可能便宜。例如,gcc似乎有一个特殊命名的函数(如main:{lambda()#1}::operator()()const),lambda对象本身只是指向它的函数指针,调用时它会获得指向传递的本地stackframe的指针。在lambda中,所有“捕获的引用”变量都将偏移到该堆栈帧,而捕获的值将在同一堆栈帧中获得特殊的不同偏移量,这些偏移量将在创建lambda时填充。这通常也会导致不希望它们是静态的,从那时起——当按值捕获时——它们总是在第一次函数调用时具有值。