与普通函数相比,为什么 Lambda 允许增强编译器优化
Nicolai Josuttis 的 C 标准库(第二版)断言 lambda 可以与普通函数相比,编译器可以更有效地优化。这一优势源于 lambda 作为函数对象的本质。
当 lambda 传递给函数模板时,它会被实例化为专门针对该对象定制的新函数。这使得编译器可以毫不费力地内联 lambda 调用。相反,对于普通函数,函数指针将传递给函数模板。传统上,编译器在通过函数指针进行内联调用时遇到困难。
为了说明这个概念,请考虑以下函数模板:
templatevoid map(Iter begin, Iter end, F f) { for (; begin != end; begin) *begin = f(*begin); }
使用 lambda 调用此函数:
int a[] = { 1, 2, 3, 4 }; map(begin(a), end(a), [](int n) { return n * 2; });
结果是编译器创建的实例化:
template void map(int* begin, int* end, _some_lambda_type f) { for (; begin != end; begin) *begin = f.operator()(*begin); }
在这种情况下,编译器可以访问 _some_lambda_type::operator() 并可以无缝地内联调用它。每个 lambda 都有不同的类型,因此在 map() 中使用不同的 lambda 将产生一个新的实例化。
但是,如果使用函数指针:
map(int* begin, int* end, int (*f)(int)) { for (; begin != end; begin) *begin = f(*begin); }
编译器将无法内联对 f 的调用,直到对 map() 的包含调用也被内联,从而允许它精确定位特定函数。这凸显了 lambda 在编译器优化方面相对于普通函数的优势。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3