我刚刚学习了lambda表达式,并想知道使用cout
打印到控制台时表达式或常规函数是否会执行得更快。
我应该使用
// Lambda expression
auto helloWorld = []()
{
cout << "Hello World" << endl;
};
或
// Normal function
void helloWorld()
{
cout << "Hello World" << endl;
}
注意:我仍然是新手程序员,所以请随时指出我可能犯的任何错误。我只能学习
由于
答案 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的精彩博文,我强烈推荐。