将Lambda存储在类中
Storing Lambda in Class
当需要将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在时间和内存方面可能比存储对它们的引用更昂贵。
它仍然必须存储在的某个地方。。。
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- C++:对象将 lambda 存储到结构中,稍后调用该函数
- 是否可以将具有不同签名的 lambda 存储在 std::vector 中并在函数中执行它们(使用各自的参数)?
- 可以将模板化的 lambda 存储到 std::function 中吗?
- 将 lambda 存储为 std::函数时出现分段错误
- 在不模板化类的情况下存储 lambda
- 存储可变参数模板参数并将其传递给 lambda
- (C )将lambda函数存储在Boost Multi_Array中
- 带有动态存储持续时间的lambda
- Python -> C++ 习语:将 lambda 表达式存储在映射/容器中
- 存储lambda函数,该函数将范围变量捕获为类成员以供重用
- lambda 捕获的变量存储在哪里
- 将多种类型的 lambda 函数存储在一种类型的变量中
- C++ 存储在容器捕获"this"中的 Lambda
- 存储在std::函数中时,无法将无捕获lambda转换为函数指针
- 为什么我不能在SERVICE_TABLE_ENTRY中存储 lambda 函数?
- 如何在C++11中将lambda表达式存储为类的字段
- 将Lambda存储在类中
- 如何在类中存储lambda并将其捕获为参数
- 在类分段错误中存储Lambda