// 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函数,例如,不确定它是否有所不同).
从概念上讲,编译器应该能够内联lambda体.使用lambda是一个编译时间,这意味着编译器确切地知道你要调用哪个函数,因此它应该能够内联代码.使用函数指针传递的函数直到运行时才真正知道,因此编译器还有很多工作要做,以便尝试查看是否可以内联它.通常,代码不是内联的,并且您通过指针有间接.
| 归档时间: |
|
| 查看次数: |
297 次 |
| 最近记录: |