C++的lambda使用实例分析
发表于:2025-11-16 作者:千家信息网编辑
千家信息网最后更新 2025年11月16日,这篇"C++的lambda使用实例分析"文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇"
千家信息网最后更新 2025年11月16日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安全错误
数据库的锁怎样保障安全
raid服务器清除系统密码
网络安全青力量
设置的位置服务器
网络安全文明上网团小组
谷数数据库驱动
深圳 南山 软件开发
履行网络安全责任制情况
科学的网络技术
客户数据库的绩效考核
nstl二次文献数据库
怎么关闭预约管理服务器
杭州网络技术服务企业
软件开发后端工作职责
nas存储服务器安全么
电子竞技软件开发
数据库预警系统
网络安全等保3.0测评
es网上数据库
广州联通分公司软件开发
维普期刊数据库可以看文献吗
数据库备份和删除的区别
163服务器设置
北京软件开发的小公司
网络安全法制宣传月活动
怀旧服服务器空间不足
华为网络安全救援
游戏软件开发专业考什么证书
me服务器
东明县博朗网络技术服务中心
数据库连接出错