首页 > 后端开发 > C++ > 为什么 Lambda 比 C 中的普通函数更可优化?

为什么 Lambda 比 C 中的普通函数更可优化?

Susan Sarandon
发布: 2024-11-24 06:00:19
原创
704 人浏览过

Why are Lambdas More Optimizable than Plain Functions in C  ?

与普通函数相比,为什么 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中文网其他相关文章!

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