C++的lambda使用实例分析
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇"C++的lambda使用实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"
千家信息网最后更新 2025年02月01日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安全错误
数据库的锁怎样保障安全
旅游公司网络安全事故
山东网络安全公司高鹏
计算机软件开发就是
数据库利润表设计
景区旅游信息管理系统 数据库
株洲it软件开发师学校
app后台要装服务器吗
模糊神经网络技术
记录数据库操作日志
窗体什么时候需要连接数据库
江苏税务服务器地址虚拟主机
衡阳软件开发中介
2018贵州网络安全周活动
动作模板软件开发
辽宁网络时间同步服务器虚拟主机
河北进口软件开发差异
武威服务器数据恢复门店
谈谈对数据库的认识理解收获
远程linux达梦数据库使用
数据库查询正序
yii 多数据库配置
依法治理网络安全信息内容
管家婆什么版本自带数据库
天源网络技术有限公司怎么样
审查元素修改服务器数据
服务器运维管理系统电话
直播公司服务器需要多大的宽带
上海威力网络技术采购信息
不能设置数据库安全
我的世界怎么搞电脑版服务器