与普通函数相比,为什么 Lambda 允许增强编译器优化
Nicolai Josuttis 的 C 标准库(第二版)断言 lambda 可以与普通函数相比,编译器可以更有效地优化。这一优势源于 lambda 作为函数对象的本质。
当将 lambda 传递给函数模板时,它会被实例化为专门针对该对象定制的新函数。这使得编译器可以毫不费力地内联 lambda 调用。相反,对于普通函数,函数指针将传递给函数模板。传统上,编译器在通过函数指针进行内联调用时遇到困难。
为了说明这个概念,请考虑以下函数模板:
template <typename Iter, typename F> void 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*, _some_lambda_type>(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*, int (*)(int)>(int* begin, int* end, int (*f)(int)) { for (; begin != end; ++begin) *begin = f(*begin); }
编译器将无法内联对 f 的调用,直到对 map() 的包含调用也被内联,从而允许它精确定位特定函数。这凸显了 lambda 在编译器优化方面相对于普通函数的优势。
以上是为什么 Lambda 比 C 中的普通函数更可优化?的详细内容。更多信息请关注PHP中文网其他相关文章!