通过值或引用传递lambda会更容易内联吗?

use*_*108 7 c++ lambda c++14

之前已经提出过类似的问题,但我仍然感到困惑.我相信STL只是通过值传递,因为通过引用传递可能会在多线程环境中产生影响.比如说,当两个或多个线程正在执行一个可变的lambda时.当我只想调用lambda时,我目前使用通用引用:

template <typename F>
inline void invoke(F&& f)
{
  f();
}
Run Code Online (Sandbox Code Playgroud)

这会绑定到任何函数对象,就像一个const&愿望,但也许这对于内联来说是一个坏主意.复制传递的lambda更容易由编译器内联吗?我希望通过的lambdas尽可能"无法忍受".

BoB*_*ish 3

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

int foo = 1000;
auto f = [=]() ->int { return foo; };
Run Code Online (Sandbox Code Playgroud)

有点相当于:

class FooLambda {
    int foo;
  public:
    FooLambda(int foo) : foo(foo) {}
    int operator()(){ return foo; }
};
// ...
int foo = 1000;
FooLambda f(foo);
Run Code Online (Sandbox Code Playgroud)

所以你看,如果函数体本身出现在与调用它相同的翻译单元中(如果不是由一些更智能的编译器,则可能是这样),则函数体本身可以被内联。由于你invoke是一个模板,它知道 lamdba 的实际类型,并且你不会强迫它跳过函数指针环,这是内联的一个很大的抑制因素。

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