广告
返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >论C++的lambda是函数还是对象
  • 895
分享到

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

2024-04-02 19:04:59 895人浏览 八月长安
摘要

先说结论: 对于有捕获的lambda,其等价于对象。对于没有任何捕获的lambda,其等价于函数! 首先,很多c++程序员从lambda 用法上反推容易发现是对象,因为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<int> ns = {100, 200, 300};
auto foo = [&ns](int a) {
    return ns.find(a);
};
cout<< foo(99);

大致等价于:

struct Foo {
    Foo(set<int>* p) {p_ns = p;}
    bool operator()(int a) {
        auto &ns = *p-ns;
        return ns.find(a);
    }
private:
    set<int>* p_ns;
};
...
set<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;
}

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

auto cb = [&](void*)->void* {
        cout<<"xxxx"<<endl;
        return nullptr;
    };
    pthread_create(&t, NULL, 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-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++中的lambda内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: 论C++的lambda是函数还是对象

本文链接: https://www.lsjlt.com/news/139567.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 论C++的lambda是函数还是对象
    先说结论: 对于有捕获的lambda,其等价于对象。对于没有任何捕获的lambda,其等价于函数! 首先,很多C++程序员从lambda 用法上反推容易发现是对象,因为lambda可...
    99+
    2022-11-13
  • php的array()操作的是数组还是对象
    在PHP中,array()操作的是数组,是允许对数组操作的函数,该函数的作用是创建数组;PHP支持单维和多维的数组,同时提供了用数据库查询结果来构造数组的函数,语法为“array(value1,value2,value3,etc.)”或者“...
    99+
    2022-07-11
    php
  • C++语言中函数对象的作用是什么
    C++语言中函数对象的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。在C++语言的世界中有这样两个概念,向上类型转换,向下类型转换,分别描述的是子类向基类和基类向子类...
    99+
    2023-06-17
  • C++:函数对象,STL提供的函数对象,函数适配器详解
    目录1 函数对象2 STL提供的函数对象3 函数适配器总结1 函数对象 1.函数对象是行为类似函数的对象。一个类对象,表现出一个函数的特征,即通过对象名+(参数列表)的方式使用一个类...
    99+
    2022-11-12
  • C++11的函数对象怎么使用
    这篇文章主要介绍“C++11的函数对象怎么使用”,在日常操作中,相信很多人在C++11的函数对象怎么使用问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”C++11的函数对象怎么使用”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-19
  • 一文读懂C++中的函数对象
    这篇文章给大家介绍一文读懂C++中的函数对象,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。如果一个类将()运算符重载为成员函数,这个类就称为函数对象类,这个类的对象就是函数对象。函数对象是一个对象,但是使用的形式看起来...
    99+
    2023-06-06
  • php对象转为数组的函数是哪个
    这篇文章将为大家详细讲解有关php对象转为数组的函数是哪个,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。在php中,对象转为数组的函数是“get_object_vars()”。get_object_var...
    99+
    2023-06-15
  • C#的对象类型是什么
    本文小编为大家详细介绍“C#的对象类型是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“C#的对象类型是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。对象(Object)类型对象(Object)类型&nb...
    99+
    2023-06-17
  • 一起来学习C++的函数指针和函数对象
    目录函数指针函数对象总结函数指针 以下是<cstdlib>库中的一个排序数组的方法qsort()的函数原型。 void qsort (void* base, size_t...
    99+
    2022-11-13
  • C++中类对象的拷贝构造函数
    本篇内容主要讲解“C++中类对象的拷贝构造函数”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“C++中类对象的拷贝构造函数”吧!拷贝构造函数,是一种特殊的构造函数,它由编译器调用来完成一些基于同一...
    99+
    2023-06-17
  • python中lambda函数的作用是什么
    lambda函数是一种匿名函数,它可以在不定义函数名称的情况下创建函数。lambda函数通常用于简单的、单行的函数定义,可以作为参数...
    99+
    2023-09-20
    python
  • Python中lambda函数的用法是什么
    在Python中,lambda函数是一种匿名函数,也称为lambda表达式。它只能包含一个表达式,并且返回该表达式的结果。lambd...
    99+
    2023-08-18
    Python lambda
  • C语言当函数执行成功时return1还是0
    目录1、C语言函数的返回值2、“行业潜规则”3、函数成功只有一种可能,函数失败却有多种可能4、C语言程序员中还有一种“行业潜规则”5、最后今天分享的内容是关于函数执行成功,返回0还是...
    99+
    2022-11-12
  • php中把对象转为数组的函数是哪个
    这篇文章主要介绍php中把对象转为数组的函数是哪个,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!php中把对象转为数组的函数是“get_object_vars()”,该函数用于获取给定对象的属性,并返回由对象属性组成...
    99+
    2023-06-28
  • php中把对象转为数组的函数是什么
    本教程操作环境:windows7系统、PHP7.1版、DELL G3电脑php中把对象转为数组的函数是“get_object_vars()”。get_object_vars()函数用于获取给定对象的属性,并返回由对象属性组成的关联数组。但如...
    99+
    2019-02-01
    php 对象转数组
  • C++对象的构造顺序是什么
    今天小编给大家分享一下C++对象的构造顺序是什么的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。一、局部对象的构造顺序对于局部...
    99+
    2023-06-30
  • C# 中Employee对象的作用是什么
    这篇文章给大家介绍C# 中Employee对象的作用是什么,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。C# Employee对象命令的名字是PRINTOUTEMPLOYEE。ListEmployee()函数接收一个O...
    99+
    2023-06-17
  • C# 中PromptPointResult对象的作用是什么
    C# 中PromptPointResult对象的作用是什么,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。C#语言还是比较常见的东西,这里我们主要介绍C# PromptPoi...
    99+
    2023-06-17
  • C# 中Hashtable对象的作用是什么
    本篇文章给大家分享的是有关C# 中Hashtable对象的作用是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。C#语言有很多值得学习的地方,这里我们主要介绍C# Hasht...
    99+
    2023-06-17
  • C# 中MyData对象的作用是什么
    C# 中MyData对象的作用是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。C#预定义方式有很多值得学习的地方,这里我们主要介绍C# MyData对象,包括介绍Class...
    99+
    2023-06-17
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作