C++ 11 lambda表达式背后的动机是什么?

Lou*_*ong 20 c++ lambda c++11

我试图找出在C++中使用lambda表达式是否有实际的计算好处,即"这段代码编译/运行得更快/更慢,因为我们使用lambda表达式"或者它只是一个整洁的开发特权,可供不良编码器滥用试图看起来很酷?

我理解这个问题似乎是主观的,但我非常感谢社群对此事的看法.

sbi*_*sbi 43

好处是编写计算机程序最重要的事情:更容易理解代码.我不知道任何性能方面的考虑.

C++允许在某种程度上进行功能编程.考虑一下:

std::for_each( begin, end, doer );
Run Code Online (Sandbox Code Playgroud)

这个问题是函数(对象) doer

  1. 指定在循环中完成的操作
  2. 但有些隐藏了实际完成的内容(你必须查找函数对象的operator()实现)
  3. 必须std::for_each调用不同的范围内定义
  4. 包含一定量的样板代码
  5. 通常是丢弃代码,除了这个循环结构之外,它不用于任何东西

Lambdas在所有这些方面都有很大提高(也许还有一些我忘了).


Jar*_*Par 41

我认为计算性能几乎与提高语言的表达能力差不多.

  • @Brian,你住在西雅图,不应该是一个很大的变化;) (11认同)
  • 没有lambda的编程语言就像没有阳光的一天. (9认同)
  • @Brian:那么带有lambda的C++有点像生活在地下室,但有一台电视机可以看到阳光照在乡村景观上 - 你看到了光线,但感觉不一样. (4认同)

Fab*_*llo 13

本身没有性能优势,但是由于STL及其设计理念的广泛采用,对lambda的需求也随之而来.

具体来说,STL算法经常使用仿函数.如果没有lambda,则需要先声明这些函子被使用.Lambdas可以拥有"匿名"的就地仿函数.

这很重要,因为在很多情况下你只需要使用一个仿函数,并且你不想为它命名,原因有两个:你不想污染命名空间,在那些特定的情况下你给的名字要么模糊,要么非常长.

例如,我使用STL很多,但没有C++ 0x我使用的for()循环比for_each()算法及其堂兄弟更多.那是因为如果我使用for_each()代替,我需要从循环内部获取代码并为它声明一个仿函数.此外,循环之前的所有局部变量都是不可访问的,因此我需要编写其他代码以将它们作为参数传递给仿函数构造函数,或者其他等价物.因此,除非有强烈的动机,否则我倾向于不使用for_each(),否则代码会更长,更难以阅读.

这很糟糕,因为众所周知,使用for_each()和类似的算法为编译器和库提供了更多的空间来进行优化,包括自动并行.因此,间接地,lambda将支持更高效的代码.

  • 到目前为止,我发现最好的"C++ lambda简而言之"解释! (2认同)

R S*_*hko 9

IMO,关于lambda最重要的是它将相关代码保持在一起.如果你有这个代码:

std::for_each(begin, end, unknown_function);
Run Code Online (Sandbox Code Playgroud)

您需要导航unknown_function以了解代码的作用.但是使用lambda,逻辑可以保持在一起.

  • @Fred:如果你在使用点就有lambda定义,那么读者可以不遗余力地想知道这个函数是否具有良好的名称,并且作者不必为此选择一个好名字.一个只会在一个地方使用的琐碎操作. (5认同)
  • "将循环体移动到仿函数中" - 当然不是总是如此.但是如果代码没有在其他地方使用(并且你想表明是这种情况),那么在C++ 03中的匿名命名空间中的类中的`operator()`的样板是有点无聊的;-) (4认同)

Ter*_*fey 8

Lambdas是函子类的语法糖,所以不,没有计算上的好处.至于动机,可能是其他十几种流行语言中的任何一种都有lambdas?

有人可能会认为它有助于代码的可读性(让你的函子在内联函数中使用它).


Cub*_*bbi 5

虽然我认为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)