C++的lambda使用实例分析
这篇“C++的lambda使用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++的lambda使用实例分析”文章吧。
先说结论:
对于有捕获的lambda
,其等价于对象。
对于没有任何捕获的lambda
,其等价于函数!
首先,很多C++程序员从lambda
用法上反推容易发现是对象,因为lambda可以捕获!这是函数做不到的。的确,比如:
intn=100;autofoo=[n](inta){returna>n;};cout<<foo(99);
如果编译器要实现foo
,大致类比这种写法(可能真实的实现细节不是这样,但思路类似)∶
structFoo{Foo(inti){n=i;}booloperator()(inta){returna>n;}private:intn;};...intn=100;Foofoo(n);cout<<foo(99);
如果是引用捕获了变量,那么struct内有一个指针成员持有被引用捕获的变量的地址。
比如:
set<int>ns={100,200,300};autofoo=[&ns](inta){returnns.find(a);};cout<<foo(99);
大致等价于:
structFoo{Foo(set<int>*p){p_ns=p;}booloperator()(inta){auto&ns=*p-ns;returnns.find(a);}private:set<int>*p_ns;};...set<int>ns={100,200,300};Foofoo(&ns);cout<<foo(99);
然而……这并不是全部!
在没有捕获任何东西的时候,lambda
其实是等价于普通的函数的!可以用Linux C中函数pthread_create()来验证!它只能接收一个参数是void*,返回值也是void*的回调函数。
神奇的是,无参的lambda
也可以被pthread_create()
使用!
usingnamespacestd;structA{void*operator()(void*){cout<<"xxxx"<<endl;returnnullptr;}};intmain(){Aa;a(NULL);pthread_tt;//pthread_create(&t,NULL,a,NULL);//编译失败autocb=[](void*)->void*{cout<<"xxxx"<<endl;returnnullptr;};pthread_create(&t,NULL,cb,NULL);//编译通过pthread_join(t,NULL);return0;}
上面代码还可以再改一下,让cb去捕获一个变量, 比如:
autocb=[&](void*)->void*{cout<<"xxxx"<<endl;returnnullptr;};pthread_create(&t,NULL,cb,NULL);
这时,给pthread_create()传入cb同样会编译失败!错误信息:
cb.cpp:Infunction‘intmain()':cb.cpp:23:30:error:cannotconvert‘main()::<lambda(void*)>'to‘void*(*)(void*)'23|pthread_create(&t,NULL,cb,NULL);|^~|||main()::<lambda(void*)>Infileincludedfrom/usr/include/x86_64-linux-gnu/c++/9/bits/gthr-default.h:35,from/usr/include/x86_64-linux-gnu/c++/9/bits/gthr.h:148,from/usr/include/c++/9/ext/atomicity.h:35,from/usr/include/c++/9/bits/ios_base.h:39,from/usr/include/c++/9/ios:42,from/usr/include/c++/9/ostream:38,from/usr/include/c++/9/iostream:39,fromcb.cpp:1:/usr/include/pthread.h:200:15:note:initializingargument3of‘intpthread_create(pthread_t*,constpthread_attr_t*,void*(*)(void*),void*)'200|void*(*__start_routine)(void*),|~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~
这其实也不难理解,C++在lambda的设计上也贯彻着零开销 (Zero Overhead)原则,也就是C++不在性能上干多余的事,显然函数比对象开销更小。所以即使同为lambda,在有无捕获的时候,其底层实现其实是截然不同的!
以上就是关于“C++的lambda使用实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注亿速云行业资讯频道。
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。