千家信息网

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内有一个指针成员持有被引用捕获的变量的地址。

比如:

set ns = {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 多数据库配置 依法治理网络安全信息内容 管家婆什么版本自带数据库 天源网络技术有限公司怎么样 审查元素修改服务器数据 服务器运维管理系统电话 直播公司服务器需要多大的宽带 上海威力网络技术采购信息 不能设置数据库安全 我的世界怎么搞电脑版服务器
0