全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++ 中lambda表达式的编译器实现原理

什么是Lambda?

C++ 11加入了一个非常重要的特性——Lambda表达式。营里(戴维营)的兄弟都对Objective-C很熟悉,许多人多block情有独钟,将各种回调函数、代理通通都用它来实现。甚至有人选择用FBKVOController、BlocksKit等开源框架将KVO、控件事件处理都改为通过block解决。原因就是简单、方便、直观,函数的定义和使用出现在同一个地方。这里的Lambda表达式实际上和block非常类似,当然如果你用它和Swift语言的闭包比较,那就是一回事了。

现在,Android已经全面转向C++11/14标准了,看代码的话,很多地方变化很大,新标准真的是有点颠覆性的,感觉已经不会C++了。今天有看到lambda表达式,突然想看一下,这货是怎么实现的,如下,写了个例子,分别调用3个lambda表达式:

#include <stdlib.h> 
#include <stdio.h> 
//1. 无参数 
auto hello = [] () {printf( "Hello world!\n");}; 
// 2. 一个参数 
auto hello_int = [] (int val){ printf("the value is %d\n", val); }; 
int main(int argc, char **argv) { 
 hello(); 
 hello_int(argc); 
 // 3. 带捕获列表的lambda表达式 
 auto lambda = [argc, argv]() {printf("param: %d, path is:%s\n", argc, argv[0]);}; 
 lambda(); 
 return 0; 
}

很简单定义三个lambda表达式,lambda表达式就不细说是什么了,基本上是介绍新标准的书,都会说的很明白。这里想看一下,具体编译器是怎么实现表达式的呢?第一印象,应该是表达式按照内联函数的方式实现的吧,调用的地方自动展开,这样参数、捕获列表啥的都很好实现。

简单看一下,编译时不优化,反汇编看一下,如下,调用的main函数:

上面按顺序调用的,就是代码中对应的三个lambda表达式。从这个反汇编看,貌似和猜想的不一样是调了函数不是内联展开。
红色框住的调用函数[蓝色是实际的符号,灰色是demangle后的,分析看这个],分别是:

$_0::operator()(void)  
$_1::operator()(int) 
main::$_2::operator() const(void) 

这是三个重载的()操作符.. 调用前看到有压入this参数,这是对象的方法调用,从反汇编看,是栈上创建对象,然后直接使用,使用是通过operator()..

这货不就是函数对象么????

OK,那就明白了,lambda表达式,编译器自动转换成函数对象执行。。。。

上面的例子,编译器转换的如下:

#include <stdlib.h> 
#include <stdio.h> 
class $_0 { 
public: 
 void operator() { 
 printf( "Hello world!\n"); 
 } 
}; 
class $_1 { 
public: 
 void operator(int va) { 
  printf("the value is %d\n", val); 
 } 
}; 
class main::$_2 { 
public: 
 main::$_2(int i, char **v): argc(i), argv(v) {} 
 //带捕获列表的,不能修改捕获列表... 
 void operator() const { 
 printf("param: %d, path is:%s\n", argc, argv[0]); 
 } 
private: 
 int argc; 
 char **argv; 
} 
int main(int argc, char **argv) { 
 $_0 hello; 
 hello(); 
 $_1 hello_int; 
 hello_int(argc); 
 main::$_2 lambda(argc, argv); 
 lambda(); 
 return 0; 
}

这里,lambda转换后的符号,是编译器自动生成的,看起来稍有点别扭。

以上所述是小编给大家介绍的C++ 中lambda表达式的编译器实现原理,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!


# c  # lambda表达式  # C++中的Lambda函数详解  # C++11/14 线程中使用Lambda函数的方法  # 浅谈C++11新引入的lambda表达式  # C++ 中使用lambda代替 unique_ptr 的Deleter的方法  # C++ 中的Lambda表达式写法  # c++ lambda捕获this 导致多线程下类释放后还在使用的错误问题  # 这是  # 是怎么  # 想看  # 看一下  # 反汇编  # 小编  # 的是  # 如果你  # 那就  # 在此  # 就不  # 出现在  # 的书  # 给大家  # 很简单  # 写了  # 会说  # 人多  # 非常重要  # 情有独钟 


相关文章: 如何在阿里云虚拟主机上快速搭建个人网站?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  成都网站制作报价公司,成都工业用气开户费用?  如何用虚拟主机快速搭建网站?详细步骤解析  建站之星如何通过成品分离优化网站效率?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  如何通过服务器快速搭建网站?完整步骤解析  教育培训网站制作流程,请问edu教育网站的域名怎么申请?  网站制作企业,网站的banner和导航栏是指什么?  宝塔面板创建网站无法访问?如何快速排查修复?  海南网站制作公司有哪些,海口网是哪家的?  宝塔新建站点报错如何解决?  重庆网站制作公司哪家好,重庆中考招生办官方网站?  焦点电影公司作品,电影焦点结局是什么?  英语简历制作免费网站推荐,如何将简历翻译成英文?  招贴海报怎么做,什么是海报招贴?  建站之星代理商如何保障技术支持与售后服务?  如何快速启动建站代理加盟业务?  建站之星与建站宝盒如何选择最佳方案?  如何在Golang中处理模块冲突_解决依赖版本不兼容问题  建站DNS解析失败?如何正确配置域名服务器?  三星网站视频制作教程下载,三星w23网页如何全屏?  logo在线制作免费网站在线制作好吗,DW网页制作时,如何在网页标题前加上logo?  如何在橙子建站上传落地页?操作指南详解  北京营销型网站制作公司,可以用python做一个营销推广网站吗?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  平台云上自主建站:模板化设计与智能工具打造高效网站  黑客如何利用漏洞与弱口令入侵网站服务器?  贸易公司网站制作流程,出口贸易网站设计怎么做?  建站之星体验版:智能建站系统+响应式设计,多端适配快速建站  平台云上自助建站如何快速打造专业网站?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  网站制作难吗安全吗,做一个网站需要多久时间?  微信小程序 五星评分(包括半颗星评分)实例代码  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  智能起名网站制作软件有哪些,制作logo的软件?  建站之星安装后如何自定义网站颜色与字体?  专业企业网站设计制作公司,如何理解商贸企业的统一配送和分销网络建设?  如何高效配置IIS服务器搭建网站?  营销式网站制作方案,销售哪个网站招聘效果最好?  php8.4新语法match怎么用_php8.4match表达式替代switch【方法】  如何通过云梦建站系统实现SEO快速优化?  如何登录建站主机?访问步骤全解析    如何选择高效稳定的ISP建站解决方案?  如何快速生成专业多端适配建站电话?  如何自定义建站之星模板颜色并下载新样式?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  如何撰写建站申请书?关键要点有哪些?  企业微网站怎么做,公司网站和公众号有什么区别? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。