通过值或引用传递lambda是否更容易内联?

时间:2016-03-08 11:33:47

标签: c++ lambda c++14

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

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

这会绑定到任何函数对象,就像const&一样,但也许这不是内联的坏主意。复制传递的lambda更容易由编译器内联吗?我希望通过的lambdas能够成为&#34; inlinable&#34;尽可能。

1 个答案:

答案 0 :(得分:2)

将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中的值或引用来获取可调用对象,确定捕获的变量是否是函数体的本地,如果它意味着它们将在高速缓存中。