首页 > 作文

论C++的lambda是函数还是对象

更新时间:2023-04-05 01:35:38 阅读: 评论:0

先说结论:

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

比如:

t<int> ns = {100, 200, 300};auto foo = [&ns](int a) {  return ns.find(a);};cout<< foo(99);

大致等价于:

struct foo {  foo(t<int>* p) {p_ns = p;}  bool operator()(int a) {    auto &ns = *p-ns;    return ns.find(a);  }private:  t<int>* p_ns;};...t<int> 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"<<endl;    return nullptr;  }};int main() {  a a;  a(null);  pthread_t t;  //pthread_create(&t, 流浪狗和流浪猫null, a, null); // 编译失败  auto cb = [](void*)->void* {    cout<<"xxxx"<<endl;    return nullptr;  };  pthread_create(&t, null, cb, null); // 编译通过  pthread_join(t, null);  return 0;}

i是什么上面代码还可以再改一下,让cb去捕获一个变量, 比如:

auto cb = [&](void*)->void* {    cout<<"xxxx"<<endl;    return nullptr;  };  pthread_create(&t, n考教资报名时间ull, cb, null);

这时,给pthread_create()传入cb同样会编译失败!错误信息:

cb.cpp: in function ‘int main()':cb.cpp:23:30: error: cannot convert ‘main()::<lambda(void*)>' to ‘void* (*)(void*)' 23 |   pthread_create(&t, null, cb, null);   |               ^~   |               |   |               main()::<lambda(void*)>in file included from /usr/include/x86_64-linux-gnu/c++/9/bits/gthr-de到吴起镇歌词fault.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_ba.h:39,        from /usr/include/c++/9/ios:42,        from /usr/include/c++/9/ostream:38,        from /usr/include/c++/9/ios二年级语文tream: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++中的lambda内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-05 01:35:37,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/14f81710053fd748932c0da46ffa8b0a.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:论C++的lambda是函数还是对象.doc

本文 PDF 下载地址:论C++的lambda是函数还是对象.pdf

上一篇:聚合硫酸铁
下一篇:返回列表
标签:函数   对象   变量   开销
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图