什么是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小时内与您取得联系。