我看到它的方式,如果lambda必须存储状态,它可能不会被内联。如果它不存储状态,那么它就像一个简单的自由函数,并且它有更多机会被内联。
标准是否说了什么?
class Window {public:int value = 5;};
class SomeClass:
{
public:
Window *w;
void DoSomething()
{
auto error = [&](int n)
{
std::cout << (w->value * 5);
return w->value * n;
};
auto error = [](Window *w, int n)
{
std::cout << (w->value * 5);
return w->value * n;
};
error(w, 7);
error(7);
// ...
error(w, 10);
error(10);
}
}
答案 0 :(得分:1)
在过去的几年里,我花了大量的业余时间编写一个编译器来处理LLVM,我很确定任何体面的编译器都会内联这两个 - 如果没有,我会提出一个任何使编译器没有的人的错误。
[...]
中的东西只是一个额外的参数(一个“闭包参数”),它通常会变成一个指向结构的指针[当函数是/如果函数是的话,它可以被“unicked”到常规参数中内联。
一个简单的小函数未被内联的主要原因是它是通过函数指针调用的,包括vtable。非静态[在全局级别]函数也可能在非内联版本中生成,因为编译器无法确定该函数未在其他地方调用。
当然,LARGE函数可能不会被内联,因为编译器认为这样做是浪费空间,但是例如gcc会在知道只有一个地方的时候内联非常大的函数。
我还认为编译器将lambda内联到其他函数的方式没有区别 - 除了显然无法从其他任何地方调用它们之外[除非将lambda传递出函数被声明为std :: function或类似 - 但不能以任何方式内联]。
如果您非常关心,请检查编译器输出。