将Lambda存储在类中

Storing Lambda in Class

本文关键字:存储 Lambda      更新时间:2023-10-16

当需要将lambda存储为类成员以便推迟其调用时,最佳做法是什么?更具体地说,将传递给类deferred_lambda的lambda存储在下面列出的代码中作为引用是否安全?如果不是,那么如果我将lambda作为值而不是引用存储在deferred_lambda中,安全吗?

最后,与使用g++的常规函数调用相比,我是否会因为以这种方式将lambda存储为类成员而导致性能损失?也就是说,使用deferred_lambda.invoke()会比在某个将实现相同操作的伪结构上调用operator()慢吗?

对于g++,我注意到lambda的大小随着我使用更多捕获的变量而增加。我想这是意料之中的事,因为据我所知,编译器在内部为lambda生成一个结构,其中包含作为成员的必要捕获变量。这一观察结果导致了我现在要问的问题,因为按值存储lambda在时间和内存方面可能比存储对它们的引用更昂贵。

template <class Func>
class deferred_lambda
{
    Func& func_;
public:
    deferred_lambda(Func func) : func_(func) {}
    void invoke() { func_(); }
};
template <class Func>
deferred_lambda<Func> defer_lambda(Func func)
{
    return deferred_lambda(func);
}
void foo()
{
    int a, b, c;
    auto x = defer_lambda([&]() { a = 1; b = 2; c = 3; });
} 

我认为存储lambda以供以后执行的方法是使用std::function对象。根据库实现的不同,function类应该具有必要的构造函数和转换器,以便为其分配lambda或任何其他类型的函子或函数,以便稍后执行。

更具体地说,将传递给类deferred_lambda的lambda作为引用存储在下面的代码列表中是否安全?

没有。在defereed_lambda()完成之后,这将是一个悬空的引用。

如果不是,那么如果我将lambda作为值而不是引用存储在deferred_lambda中,安全吗?

是的。但是,在执行lambda时,您仍然必须确保通过引用捕获的变量仍然有效。

也就是说,使用deferred_lambda.invoke()会比在某个将实现相同操作的伪结构上调用operator()慢吗?

可能不会,没有理由。

这一观察结果导致了我现在要问的问题,因为按值存储lambda在时间和内存方面可能比存储对它们的引用更昂贵。

它仍然必须存储在的某个地方。。。