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)
两者都有相同的拆卸.
小智 13
由于涉及到IO,所以给出几个效率周期是徒劳的.更重要的是简单性.功能完全适合您的工作,不能被打败.对于只有Lambda可以解决的工作,......
保留lambda的时候它们显然是一个很好的解决方案.它们具有优势和成本,使其成为在复杂情况下使用的非常强大的工具.如果你不能在lambda和普通函数之间做出选择,那么明显的选择就不是lambda.
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的精彩博客帖子,我强烈推荐.