【问题标题】:does passing lambda by value or reference make it easier to inline?通过值或引用传递 lambda 是否更容易内联?
【发布时间】:2016-03-08 11:33:47
【问题描述】:

之前有人问过类似的question,但我仍然很困惑。我相信 STL 完全按值传递,因为按引用传递可能会在多线程环境中产生后果。比如说,当两个或更多线程正在执行一个可变 lambda 时。当我只想调用 lambda 时,我目前使用通用引用:

template <typename F>
inline void invoke(F&& f)
{
  f();
}

这可以绑定到任何函数对象,就像const&amp; 一样,但是对于内联来说可能是个坏主意。通过副本传递的 lambda 是否更容易被编译器内联?我希望传递的 lambda 尽可能“内联”。

【问题讨论】:

  • 什么是可变 lambda?
  • mutable - 允许body修改copy捕获的参数,并调用它们的非常量成员函数
  • 哦,有一个关键字。忘记了。

标签: c++ lambda c++14


【解决方案1】:

将 lambda 视为带有函数调用运算符的小对象:

int foo = 1000;
auto f = [=]() ->int { return foo; };

有点等价于:

class FooLambda {
    int foo;
  public:
    FooLambda(int foo) : foo(foo) {}
    int operator()(){ return foo; }
};
// ...
int foo = 1000;
FooLambda f(foo);

如您所见,如果在调用它的同一翻译单元中看到函数体本身,则可以内联(如果不是被一些更智能的编译器的话)。由于您的 invoke 是一个模板,它知道 lamdba 的实际类型,并且您不会强迫它跳过函数指针箍,这是内联的一大障碍。

invoke 中通过值或引用获取可调用对象确定捕获的变量 是否是函数体的本地变量,如果这意味着它们将在缓存中,则可能会有所不同。

【讨论】:

  • 我认为复制更适合缓存?
  • 这是我听说的。还没有运行我自己的号码。
猜你喜欢
  • 2020-04-10
  • 2016-05-04
  • 2014-02-08
  • 1970-01-01
  • 2017-07-11
  • 1970-01-01
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多