C++的lambda使用实例分析
发表于:2024-09-22 作者:千家信息网编辑
千家信息网最后更新 2024年09月22日,这篇"C++的lambda使用实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"
千家信息网最后更新 2024年09月22日C++的lambda使用实例分析
这篇"C++的lambda使用实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"C++的lambda使用实例分析"文章吧。
先说结论:
对于有捕获的
lambda
,其等价于对象。对于没有任何捕获的
lambda
,其等价于函数!
首先,很多C++程序员从lambda
用法上反推容易发现是对象,因为lambda可以捕获!这是函数做不到的。的确,比如:
int n = 100;auto foo = [n](int a) { return a > n;};cout<< foo(99);
如果编译器要实现foo
,大致类比这种写法(可能真实的实现细节不是这样,但思路类似)∶
struct Foo { Foo(int i) {n=i;} bool operator()(int a) { return a > n; }private: int n;};...int n = 100;Foo foo(n);cout<< foo(99);
如果是引用捕获了变量,那么struct内有一个指针成员持有被引用捕获的变量的地址。
比如:
setns = {100, 200, 300};auto foo = [&ns](int a) { return ns.find(a);};cout<< foo(99);
大致等价于:
struct Foo { Foo(set* p) {p_ns = p;} bool operator()(int a) { auto &ns = *p-ns; return ns.find(a); }private: set * p_ns;};...set ns = {100, 200, 300};Foo foo(&ns);cout<< foo(99);
然而……这并不是全部!
在没有捕获任何东西的时候,lambda
其实是等价于普通的函数的!可以用Linux C中函数pthread_create()来验证!它只能接收一个参数是void*,返回值也是void*的回调函数。
神奇的是,无参的lambda
也可以被pthread_create()
使用!
using namespace std;struct A { void* operator()(void*) { cout<<"xxxx"<void* { cout<<"xxxx"< 上面代码还可以再改一下,让cb去捕获一个变量, 比如:
auto cb = [&](void*)->void* { cout<<"xxxx"<这时,给pthread_create()传入cb同样会编译失败!错误信息:
cb.cpp: In function 'int main()':cb.cpp:23:30: error: cannot convert 'main()::' to 'void* (*)(void*)' 23 | pthread_create(&t, NULL, cb, NULL); | ^~ | | | main():: In file included from /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, from cb.cpp:1:/usr/include/pthread.h:200:15: note: initializing argument 3 of 'int pthread_create(pthread_t*, const pthread_attr_t*, void* (*)(void*), void*)' 200 | void *(*__start_routine) (void *), | ~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~ 这其实也不难理解,C++在lambda的设计上也贯彻着零开销 (Zero Overhead)原则,也就是C++不在性能上干多余的事,显然函数比对象开销更小。所以即使同为lambda,在有无捕获的时候,其底层实现其实是截然不同的!
以上就是关于"C++的lambda使用实例分析"这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注行业资讯频道。
C++
函数
内容
等价
实例
实例分析
分析
变量
对象
编译
开销
文章
时候
知识
篇文章
不同
普通
神奇
截然不同
东西
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
如何树立网络安全法治观念
navicat 多数据库
网络技术群介绍
徐汇区专业网络技术哪家好
郑州坐标软件开发有限公司
北京中国移动网络技术有限公司
数据库成功修复
办公室网络安全存在问题
合肥方便网络技术咨询哪家好
数据库高峰论坛
定西服务器核酸
数据中心怎么设置服务器
正规网络安全工作方案供应商
h1z1切换服务器就闪退
下载服务器安装
迪哥现在服务器号码是多少
php怎么保证数据库安全
服务器的串口重定向什么意思
lol国内玩什么服务器不卡
定制化软件开发终验法会计分录
一个用户可以修改自己的数据库密码
网络安全维护多项选择
徐汇区专业网络技术哪家好
河南现代软件开发价格表格
廊坊c 软件开发论坛
数据库两表关联去重
天津友联网络技术怎么样
资兴县电子软件开发培训班
这大数据库
手机本地服务器