返回顶部
首页 > 资讯 > 后端开发 > 其他教程 >C++的lambda使用实例分析
  • 907
分享到

C++的lambda使用实例分析

2023-06-29 05:06:03 907人浏览 安东尼
摘要

这篇“c++的lambda使用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“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<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);

然而&hellip;&hellip;这并不是全部!
在没有捕获任何东西的时候,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使用实例分析”这篇文章的内容,相信大家都有了一定的了解,希望小编分享的内容对大家有帮助,若想了解更多相关的知识内容,请关注编程网其他教程频道。

--结束END--

本文标题: C++的lambda使用实例分析

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

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

猜你喜欢
  • C++的lambda使用实例分析
    这篇“C++的lambda使用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C++的lambda使用实例分析”文章吧...
    99+
    2023-06-29
  • Java的Lambda表达式使用实例分析
    这篇文章主要讲解了“Java的Lambda表达式使用实例分析”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java的Lambda表达式使用实例分析”吧!Lambada 简介lambda 表达...
    99+
    2023-07-05
  • C++精要分析lambda表达式的使用
    目录引言语法与示例捕获列表捕获引用特殊用法实现原理应用引言 C++要走向现代语言,如果不支持lambda表达式,你很难认为这门语言和现代有什么关系。幸好,从C++11标准起,它就实现...
    99+
    2024-04-02
  • C#类使用实例分析
    这篇“C#类使用实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“C#类使用实例分析”文章吧。实例using ...
    99+
    2023-06-17
  • Java的Lambda表达式实例分析
    这篇“Java的Lambda表达式实例分析”文章的知识点大部分人都不太理解,所以小编给大家总结了以下内容,内容详细,步骤清晰,具有一定的借鉴价值,希望大家阅读完这篇文章能有所收获,下面我们一起来看看这篇“Java的Lambda表达式实例分析...
    99+
    2023-06-29
  • C++模板使用实例分析
    这篇文章主要介绍了C++模板使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++模板使用实例分析文章都会有所收获,下面我们一起来看看吧。非类型模板参数模板参数分类类型形参与非类型形参。类型形参:出现...
    99+
    2023-06-30
  • Java实例分析Lambda表达式
    这篇文章主要介绍“Java实例分析Lambda表达式”,在日常操作中,相信很多人在Java实例分析Lambda表达式问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java实例分析Lambda表达式”的疑惑有所...
    99+
    2023-06-30
  • C++实例详解lambda表达式的使用
    目录lambda表达式1、lambda表达式语法2、lambda应用3、lambda表达式的应用实践1、计算器案例2、智能指针案例3、优先级队列lambda表达式 C++11 函数对...
    99+
    2024-04-02
  • C++的智能指针使用实例分析
    今天小编给大家分享一下C++的智能指针使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。什么是RAIIRAII(Re...
    99+
    2023-06-29
  • C++引用的定义与使用实例分析
    这篇文章主要介绍了C++引用的定义与使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++引用的定义与使用实例分析文章都会有所收获,下面我们一起来看看吧。解释引用首先我们先来看一个引用的例子int&n...
    99+
    2023-07-02
  • C语言函数使用实例分析
    这篇文章主要介绍了C语言函数使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C语言函数使用实例分析文章都会有所收获,下面我们一起来看看吧。函数的声明和定义函数声明告诉编译器有一个函数叫什么,参数是什么...
    99+
    2023-06-30
  • C++智能指针使用实例分析
    这篇文章主要介绍了C++智能指针使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇C++智能指针使用实例分析文章都会有所收获,下面我们一起来看看吧。1.简介程序运行时存在静态空间、栈和堆区,用堆来存储动...
    99+
    2023-06-30
  • C语言指针使用实例分析
    今天小编给大家分享一下C语言指针使用实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。何为指针指针这玩意说白了,就是用来...
    99+
    2023-07-02
  • 深入分析与实例:Python中的lambda函数应用
    Python中lambda函数的实例应用与案例分析 Python是一门多范式的编程语言,支持函数式编程。在函数式编程中,lambda函数是一种非常有用的工具。它是一种匿名函数,可以在需要函数的地方使用,并且可以快速定义简单的功能...
    99+
    2024-02-03
    案例分析 lambda函数 实例应用
  • C++BoostAny示例分析使用
    目录一、提要二、Boost.Any示例一、提要 强类型语言,例如 C++,要求每个变量都有一个特定的类型来定义它可以存储什么样的信息。其他语言,例如 JavaScript,允许开发人...
    99+
    2022-11-13
    C++ Boost Any C++ Boost Any示例
  • Linq lambda表达式的示例分析
    小编给大家分享一下Linq lambda表达式的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!Linq lambda表达式了解过C# 3.0的新特性的话应...
    99+
    2023-06-17
  • Redis的使用实例分析
    这篇文章主要介绍“Redis的使用实例分析”,在日常操作中,相信很多人在Redis的使用实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Redis的使用实例分析”的疑惑...
    99+
    2024-04-02
  • Vuex的使用实例分析
    这篇文章主要介绍“Vuex的使用实例分析”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“Vuex的使用实例分析”文章能帮助大家解决问题。 Vuex 简介 1. 概...
    99+
    2024-04-02
  • C#算术运算符使用实例分析
    这篇文章主要介绍了 C#算术运算符使用实例分析的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇 C#算术运算符使用实例分析文章都会有所收获,下面我们一起来看看吧。实例using System;names...
    99+
    2023-06-17
  • C语言操作符使用实例分析
    本篇内容介绍了“C语言操作符使用实例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!算术操作符主要是 (+ - * / %) 五种算数操作...
    99+
    2023-07-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作