当前位置: 首页 > 科技观察

C++lambda是函数还是对象?

时间:2023-03-18 01:37:14 科技观察

关于C++的lambda到底是函数还是对象,这个其实不能一概而论。先说结论:对于一个捕获的lambda来说,相当于一个对象。对于没有任何捕获的lambda,它相当于一个函数!首先,很多C++程序员很容易从lambda的用法中发现它是一个对象,因为lambda可以捕获!这是函数做不到的。的确,例如:intn=100;autofoo=[n](inta){returna>n;};输出<<富(99);实现细节不是这样的,但思路是类似的):structFoo{Foo(inti){n=i;}booloperator()(inta){returna>n;}private:intn;};...intn=100;Foofoo(n);cout<ns={100,200,300};autofoo=[&ns](inta){returnns.find(a);};输出<<富(99);大致相当于:structFoo{Foo(set*p){p_ns=p;}booloperator()(inta){auto&ns=*p-ns;返回ns.find(a);}private:set*p_ns;};...setns={100,200,300};噗噗(&ns);输出<<富(99);然而……这还不是全部!不捕获任何东西有时,lambda实际上等同于一个普通函数!可以通过LinuxC中的函数pthread_create()来验证!它只能接收参数为void*且返回值也为void*的回调函数。令人惊奇的是,没有参数的lambda也可以被pthread_create()使用!#include#includeusingnamespacestd;structA{void*operator()(void*){cout<<"xxxx"<void*{cout<<"xxxx"<void*{cout<<"xxxx"<'to'void*(*)(无效*)'23|pthread_create(&t,NULL,cb,NULL);|^~|||main()::在/usr/include/x86_64-linux-gnu/c++/9/bits/gthr-default.h:35包含的文件中,来自/usr/include/x86_64-linux-gnu/c++/9/bits/gthr.h:148,来自/usr/include/c++/9/ext/atomicity.h:35,来自/usr/include/c++/9/bits/ios_base.h:39,来自/usr/include/c++/9/ios:42,来自/usr/include/c++/9/ostream:38,来自/usr/include/c++/9/iostream:39,来自cb.cpp:1:/usr/include/pthread.h:200:15:注意:正在初始化'intpthread_create(pthread_t*,constpthread_attr_t*,void*(*)(void*),void*)'的参数3200|void*(*__start_routine)(void*),|~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~这个其实不难理解,C++也贯彻了零开销的原则(Zero开销)在lambda的设计上,也就是C++在性能上没有做多余的事情。很明显,函数比对象的开销要小,所以即使都是lambda,在有没有capture的情况下,底层的实现其实还是很不一样的!