内联lambda具有相同的函数指针间接寻址延迟

mkm*_*afa 5 c++ lambda c++11

// approach 1
template <typename T>
void f1(T t, int a, int b) {
   t(a, b);
}

// approach 2
void f2(void(*g)(int, int), int a, int b) 
{
   g(a, b); 
}

void g (int a, int b) 
{
    // do something
}

int main() 
{
   f1([](int a, int b)
         { 
           //do something 
         }, 1, 2);

   f2(&g, 1, 2);
}
Run Code Online (Sandbox Code Playgroud)

我的问题是,为了获得要执行的函数的地址,确实f1并且f2遭受相同的间接寻址延迟(假设lambda被实现为函数对象)?

如果lambda不是内联怎么办?

注意:我将函数f1声明为模板,将参数lambda类型的推导留给编译器(而不是强制执行std函数,例如,不确定它是否有所不同).

Nat*_*ica 5

从概念上讲,编译器应该能够内联lambda体.使用lambda是一个编译时间,这意味着编译器确切地知道你要调用哪个函数,因此它应该能够内联代码.使用函数指针传递的函数直到运行时才真正知道,因此编译器还有很多工作要做,以便尝试查看是否可以内联它.通常,代码不是内联的,并且您通过指针有间接.