C++的lambda使用实例分析
导读:本文共1920字符,通常情况下阅读需要6分钟。同时您也可以点击右侧朗读,来听本文内容。按键盘←(左) →(右) 方向键可以翻页。
摘要: 先说结论:对于有捕获的lambda,其等价于对象。对于没有任何捕获的lambda,其等价于函数!首先,很多C++程序员从lambda 用法上反推容易发现是对象,因为lambda可以捕获!这是函数做不到的。的确,比如:intn=100;autofoo=[n](inta){returna>n;};cout<<foo(99);如果编译器要实现... ...
目录
(为您整理了一些要点),点击可以直达。先说结论:
对于有捕获的lambda
,其等价于对象。
对于没有任何捕获的lambda
,其等价于函数!
首先,很多C++程序员从lambda
用法上反推容易发现是对象,因为lambda可以捕获!这是函数做不到的。的确,比如:
如果编译器要实现foo
,大致类比这种写法(可能真实的实现细节不是这样,但思路类似)∶
如果是引用捕获了变量,那么struct内有一个指针成员持有被引用捕获的变量的地址。
比如:
大致等价于:
然而……这并不是全部!
在没有捕获任何东西的时候,lambda
其实是等价于普通的函数的!可以用Linux C中函数pthread_create()来验证!它只能接收一个参数是void*,返回值也是void*的回调函数。
神奇的是,无参的lambda
也可以被pthread_create()
使用!
上面代码还可以再改一下,让cb去捕获一个变量, 比如:
这时,给pthread_create()传入cb同样会编译失败!错误信息:
这其实也不难理解,C++在lambda的设计上也贯彻着零开销 (Zero Overhead)原则,也就是C++不在性能上干多余的事,显然函数比对象开销更小。所以即使同为lambda,在有无捕获的时候,其底层实现其实是截然不同的!
C++的lambda使用实例分析的详细内容,希望对您有所帮助,信息来源于网络。