以前曾问过类似的question,但我仍然感到困惑。我相信STL只是通过值传递,因为通过引用传递可能会在多线程环境中产生影响。比如说,当两个或多个线程正在执行一个可变的lambda时。当我只想调用lambda时,我目前使用通用引用:
template <typename F>
inline void invoke(F&& f)
{
f();
}
这会绑定到任何函数对象,就像const&
一样,但也许这不是内联的坏主意。复制传递的lambda更容易由编译器内联吗?我希望通过的lambdas能够成为&#34; inlinable&#34;尽可能。
答案 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
中的值或引用来获取可调用对象,确定捕获的变量是否是函数体的本地,如果它意味着它们将在高速缓存中。