为什么 Lambda 在编译器优化方面优于函数
Nicolai Josuttis 在他的书《C 标准库(第二版)》中声称 lambda与普通函数相比,享受卓越的编译器优化。这种区别源于 lambda 作为函数对象的本质,允许针对特定 lambda 对象进行函数模板实例化。
Lambda 的内联优势
与普通函数不同,它将函数指针传递给函数模板,lambda 作为函数对象传递。这会触发针对特定 lambda 对象定制的新函数的创建。因此,编译器可以毫不费力地内联 lambda 调用。
函数指针阻碍
相反,函数会受到函数模板中传递机制的阻碍。编译器在通过函数指针进行内联调用方面面临挑战。虽然理论上内联是可能的,但它也需要内联封闭函数。
实例化示例
考虑下面的函数模板“map”:
template <typename Iter, typename F> void map(Iter begin, Iter end, F f) { for (; begin != end; ++begin) *begin = f(*begin); }
使用 lambda 调用“map”:
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); }
编译器识别 lambda 的 operator() 并可以轻松内联调用
但是,当使用函数指针调用“map”时:
template <> void map<int*, int (*)(int)>(int* begin, int* end, int (*f)(int)) { for (; begin != end; ++begin) *begin = f(*begin); }
每次调用“map”时,函数指针“f”都指向不同的位置,使得编译器单独内联“f”调用是很困难的。内联还需要内联包含的“map”调用,使编译器能够确定“f”指向的特定函数。
以上是为什么 Lambda 在编译器优化方面比函数具有内联优势?的详细内容。更多信息请关注PHP中文网其他相关文章!