gpt4 book ai didi

c++ - 按值或引用传递 lambda 是否更容易内联?

转载 作者:可可西里 更新时间:2023-11-01 18:39:00 36 4
gpt4 key购买 nike

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

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

这会绑定(bind)到任何函数对象,就像 const& 一样,但内联可能不是个好主意。通过复制传递的 lambda 是否更容易被编译器内联?我希望传递的 lambda 尽可能“可内联”。

最佳答案

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

关于c++ - 按值或引用传递 lambda 是否更容易内联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35866254/

36 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com