首页 > 后端开发 > C++ > 正文

为什么 Lambda 在编译器优化方面比函数具有内联优势?

Susan Sarandon
发布: 2024-11-16 22:55:03
原创
654 人浏览过

Why do Lambdas have an Inlining Advantage Over Functions in Compiler Optimization?

为什么 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板