在类中存储Lambda

时间:2012-01-31 10:41:24

标签: c++ lambda c++11 inline

当需要将lambda存储为类成员以便可以延迟调用时,最佳实践是什么?更具体地说,将传递给下面的代码清单中的类deferred_lambda的lambda存储为引用是否安全?如果不是,如果我将deferred_lambda中的lambda存储为值而不是作为参考,是否安全?

最后,与使用g ++进行常规函数调用相比,我是否可以预期会产生性能损失,以便以这种方式将lambda存储为类成员?也就是说,在实现相同操作的某个虚拟结构上使用deferred_lambda.invoke()比调用operator()要慢吗?

使用g ++,我注意到lambda的大小随着我使用更多捕获的变量而增加。我想这是可以预料到的,因为根据我的理解,编译器在内部为lambda生成一个struct,它包含必要的捕获变量作为成员。这种观察导致了我现在要问的问题,因为按时间和内存存储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; });
} 

2 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:4)

  

更具体地说,将传递给下面代码清单中的deferred_lambda类的lambda存储为参考是否安全?

没有。这将是defereed_lambda()完成后的悬空参考。

  

如果没有,如果我将lambda作为值而不是作为参考存储在deferred_lambda中会不安全?

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

  

也就是说,使用deferred_lambda.invoke()会比在一些实现相同操作的虚拟结构上调用operator()慢吗?

可能不是,没有理由。

  

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

它仍然必须存储某处 ...