我试图找出在C++中使用lambda表达式是否有实际的计算好处,即"这段代码编译/运行得更快/更慢,因为我们使用lambda表达式"或者它只是一个整洁的开发特权,可供不良编码器滥用试图看起来很酷?
我理解这个问题似乎是主观的,但我非常感谢社群对此事的看法.
sbi*_*sbi 43
好处是编写计算机程序最重要的事情:更容易理解代码.我不知道任何性能方面的考虑.
C++允许在某种程度上进行功能编程.考虑一下:
std::for_each( begin, end, doer );
Run Code Online (Sandbox Code Playgroud)
这个问题是函数(对象) doer
operator()实现)std::for_each调用不同的范围内定义Lambdas在所有这些方面都有很大提高(也许还有一些我忘了).
Jar*_*Par 41
我认为计算性能几乎与提高语言的表达能力差不多.
Fab*_*llo 13
本身没有性能优势,但是由于STL及其设计理念的广泛采用,对lambda的需求也随之而来.
具体来说,STL算法经常使用仿函数.如果没有lambda,则需要先声明这些函子被使用.Lambdas可以拥有"匿名"的就地仿函数.
这很重要,因为在很多情况下你只需要使用一个仿函数,并且你不想为它命名,原因有两个:你不想污染命名空间,在那些特定的情况下你给的名字要么模糊,要么非常长.
例如,我使用STL很多,但没有C++ 0x我使用的for()循环比for_each()算法及其堂兄弟更多.那是因为如果我使用for_each()代替,我需要从循环内部获取代码并为它声明一个仿函数.此外,循环之前的所有局部变量都是不可访问的,因此我需要编写其他代码以将它们作为参数传递给仿函数构造函数,或者其他等价物.因此,除非有强烈的动机,否则我倾向于不使用for_each(),否则代码会更长,更难以阅读.
这很糟糕,因为众所周知,使用for_each()和类似的算法为编译器和库提供了更多的空间来进行优化,包括自动并行.因此,间接地,lambda将支持更高效的代码.
IMO,关于lambda最重要的是它将相关代码保持在一起.如果你有这个代码:
std::for_each(begin, end, unknown_function);
Run Code Online (Sandbox Code Playgroud)
您需要导航unknown_function以了解代码的作用.但是使用lambda,逻辑可以保持在一起.
Lambdas是函子类的语法糖,所以不,没有计算上的好处.至于动机,可能是其他十几种流行语言中的任何一种都有lambdas?
有人可能会认为它有助于代码的可读性(让你的函子在内联函数中使用它).
虽然我认为C++ 0x的其他部分更重要,但lambdas不仅仅是C++ 98样式函数对象的"语法糖",因为它们可以捕获上下文,并且它们按名称进行,然后它们可以采用那些上下文并执行.这是新的东西,而不是"编译更快/更慢"的东西.
#include <iostream>
#include <vector>
#include <functional>
void something_else(std::function<void()> f)
{
f(); // A closure! I wonder if we can write in CPS now...
}
int main()
{
std::vector<int> v(10,0);
std::function<void ()> f = [&](){ std::cout << v.size() << std::endl; };
something_else(f);
}
Run Code Online (Sandbox Code Playgroud)