Lambda VS功能

Lev*_*evi 12 c++ lambda function

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

我应该用吗?

// Lambda expression
auto helloWorld = []()
{
    cout << "Hello World" << endl;
};
Run Code Online (Sandbox Code Playgroud)

要么

// Normal function
void helloWorld()
{
    cout << "Hello World" << endl;
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢

小智 21

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

sort(v.begin(),
     v.end(),
     [](int a, int b){ return a > b; }
);
Run Code Online (Sandbox Code Playgroud)

但是从功能上来说并不快.

拆卸两者.

    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] 
Run Code Online (Sandbox Code Playgroud)

两者都有相同的拆卸.

  • 你应该用什么选项指定什么编译器的反汇编:你展示了函数本身的汇编,它没有告诉编译器如何优化调用. (5认同)

小智 13

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

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

  • 当然,你可以用lambda做的一切,你可以用一个函数对象类.函数或函数对象类的lambdas的主要吸引力是imo,当你有一个非常特殊的目的时,它在当前函数之外通常是无用的.并且打印"Hello World"的函数可能通常不是很有用,因此如果某个特定实例需要这样的函数,那么它很适合lambda. (4认同)
  • IIRC,lambda *是*一个函数对象(具有自己的有效匿名类和所有内容)。lambda 语法实际上避免了您必须自己创建这些类,这对于一次性场景非常有用。 (2认同)

dav*_*daf 5

Lambdas是一种创建函数对象的原位方法.函数对象通常用于C中的一个地方,一个使用函数指针作为回调.

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

void qsort (void* base, size_t num, size_t size,
            int (*compar)(const void*,const void*));
Run Code Online (Sandbox Code Playgroud)

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

template <class RandomAccessIterator>
  void sort (RandomAccessIterator first, RandomAccessIterator last);
Run Code Online (Sandbox Code Playgroud)

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

template <class RandomAccessIterator, class Compare>
  void sort (RandomAccessIterator first, RandomAccessIterator last, Compare comp);
Run Code Online (Sandbox Code Playgroud)

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

sort(v.begin(),
     v.end(),
     [](int a, int b){ return a > b; }
);
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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