之前已经提出过类似的问题,但我仍然感到困惑.我相信STL只是通过值传递,因为通过引用传递可能会在多线程环境中产生影响.比如说,当两个或多个线程正在执行一个可变的lambda时.当我只想调用lambda时,我目前使用通用引用:
template <typename F>
inline void invoke(F&& f)
{
f();
}
Run Code Online (Sandbox Code Playgroud)
这会绑定到任何函数对象,就像一个const&愿望,但也许这对于内联来说是一个坏主意.复制传递的lambda更容易由编译器内联吗?我希望通过的lambdas尽可能"无法忍受".
将 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是否是函数体的本地变量,如果这意味着它们将在缓存中,则可能会产生影响。
| 归档时间: |
|
| 查看次数: |
697 次 |
| 最近记录: |