Lambda VS功能

时间:2014-08-27 06:27:28

标签: c++ function lambda

我刚刚学习了lambda表达式,并想知道使用cout打印到控制台时表达式或常规函数是否会执行得更快。

我应该使用

// Lambda expression
auto helloWorld = []()
{
    cout << "Hello World" << endl;
};

// Normal function
void helloWorld()
{
    cout << "Hello World" << endl;
}

注意:我仍然是新手程序员,所以请随时指出我可能犯的任何错误。我只能学习

由于

3 个答案:

答案 0 :(得分:21)

我认为lambda在使用stl函数时很优雅,或者你想要快速抛弃函数而不命名它们。

sort(v.begin(),
     v.end(),
     [](int a, int b){ return a > b; }
);

但是这个功能并没有更快。

两者的拆卸。

    helloWorld1();
008112A0  mov         ecx,dword ptr ds:[813054h]  
008112A6  push        8119A0h  
008112AB  call        std::operator<<<std::char_traits<char> > (0811780h)  
008112B0  mov         ecx,eax  
008112B2  call        dword ptr ds:[813038h]  
    helloWorld2();
008112B8  mov         ecx,dword ptr ds:[813054h]  
008112BE  push        8119A0h  
008112C3  call        std::operator<<<std::char_traits<char> > (0811780h)  
008112C8  mov         ecx,eax  
008112CA  call        dword ptr ds:[813038h] 

两者都有相同的反汇编。

答案 1 :(得分:13)

由于涉及到IO,所以给出几个效率周期的假装毫无意义。更重要的是简单性。功能完全适合您的工作,不能被打败。对于只有Lambda可以解决的工作,......

保留lambda,因为它们显然是一个很好的解决方案。它们具有优势和成本,使其成为在复杂情况下使用的非常强大的工具。如果你不能在lambda和普通函数之间做出选择,那么显而易见的选择就不是lambda。

答案 2 :(得分:5)

Lambdas是一种创建函数对象的方法。函数对象通常用在C语言的地方,一个使用函数指针作为回调。

一个例子可能是C qsort函数。为了能够对任何类型的数组进行排序,您必须为其提供一个函数的地址,该函数将接收指向数组的两个元素的指针,并返回整数,指示第一个是否比第二个更少(应该在之前订购)。 :

void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));

另一方std::sort不需要比较器功能:

template <class RandomAccessIterator>
  void sort (RandomAccessIterator first, RandomAccessIterator last);

但是如果你需要传递一两个指定一个不同的顺序,你可以传递一个函数对象:

template <class RandomAccessIterator, class Compare>
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);

您可以使用lambda创建该函数对象,如mohaned所做的那样:

sort(v.begin(),
     v.end(),
     [](int a, int b){ return a > b; }
);

使用lambdas,函数对象和函数指针将其作为参数传递给算法,作为回调以在发生事件和类似情况时得到通知。

要将代码划分为meanifung命名的片段,请将其拆分为定义良好的函数。 要将函数作为参数传递给其他函数,函数对象是一种很好的方法。 如果函数对象非常小,它只使用了一个,或者你没有看到给它命名的好处,你可以把你的函数对象写成一个lambda。

你的问题是关于表现。函数对象(和lambdas)与函数指针进行比较。它们可以更快地执行。

如果查看qsort,它将收到函数的地址,并且每次必须进行比较时都会执行函数调用。没有办法内联,因为qsort和你的函数是分开编译的。

在std :: sort示例中,lambda代码在编译时可用,如果它很简单,编译器将选择内联并避免所有函数调用。

Yesteday isocpp.org链接到一篇名为Demystifying C++ lambdas的精彩博文,我强烈推荐。