”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么 Lambda 比 C++ 中的普通函数更可优化?

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

发布于2024-11-16
浏览:635

Why are Lambdas More Optimizable than Plain Functions in C  ?

与普通函数相比,为什么 Lambda 允许增强编译器优化

Nicolai Josuttis 的 C 标准库(第二版)断言 lambda 可以与普通函数相比,编译器可以更有效地优化。这一优势源于 lambda 作为函数对象的本质。

当 lambda 传递给函数模板时,它会被实例化为专门针对该对象定制的新函数。这使得编译器可以毫不费力地内联 lambda 调用。相反,对于普通函数,函数指针将传递给函数模板。传统上,编译器在通过函数指针进行内联调用时遇到困难。

为了说明这个概念,请考虑以下函数模板:

template 
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* 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