c++之function和bind详解-SurfaceFlinger学习必备语法基础

C++11绑定器bind及function机制 之前在学muduo网络库时,看到陈硕以基于对象编程的方式,大量使用boost库中的bind和function机制,如今,这些概念都已引入至C++11,包含在头文件中。本篇文章主要梳理C++绑定器相关的内容以及C++11中引入的functionbind1st、bind2nd、bind(C++11)。学完本篇内容,将对C++绑定器及function机制等的底层实现有深刻理解,那么我们开始说吧。本文通过C++11之前的bind1st和bind2nd。 阅读详情

背景

C++中的function和bind是为了更方便地进行函数对象的封装和调用而设计的,在SurfaceFlinger源码中也是有很多使用部分。
比如分析Vsync相关源码时候有相关回调时候

在这里插入图片描述可以看到这里的mRegistration就有个参数是 std::bind,怎么这里就可以进行回调呢?
所以基于以上背景就需要学习今天的function和bind的知识才可以很轻松的分析对。

function

文档描述:
在这里插入图片描述

总结概况:

function是一个通用的函数对象容器,可以存储任意可调用对象(函数、函数指针、成员函数、成员变量、lambda表达式,任何function对象,比如一个类,定义了operator()),并提供了一致的接口来调用这些对象。通过function,可以将一个函数或函数对象作为参数传递给其他函数或存储在容器中,大大提高了灵活性。

template <class Ret, class... Args> class function<Ret(Args...)>;

参数解释:

Ret:代表调用function的返回结果的类型

Args:代表是参数的类型。

demo展示:

1、function存储函数指针方式

#include <iostream>
#include <functional>

int fl(int a)
{
    std::cout << "a = " << a<< std::endl;
    return a*2;
}

int main()
{
    //直接可以接受函数指针的赋值
    std::function<int(int)> f = fl;
    int functionResult = f(1);
    std::cout<<"function result = "<<functionResult<<std::endl;
    int directResult   = fl(1);
    std::cout<<" fl result = "<<directResult<<std::endl; // 调用fl函数

    return 0;
}
结果如下:

在这里插入图片描述
明显可以看到这里使用function对象调用方式和直接调用方法的方式都是一样的,结果都是2

2、存储类对象
在这里插入图片描述

可以看到这里的Add类对象也是可以作为一个作为一个function对象,但是这里需要注意Add类一定要进行重载operator这个方法

3、存储成员方法
代码如下:
在这里插入图片描述可以看出这里可以直接边类的成员方法赋值给function,不过这里function的Args里面第一个参数必须要求传递类对象。
调用function时候第一个参数也是必须要是Add类的对象

4、lamada表达式情况

在这里插入图片描述可以看出lamada表达式也是可以直接赋值给function对象

5、类成员变量情况
在这里插入图片描述可以看到类成员也可以直接通过function方式获取得到正确数据。

bind

学习文档:
https://legacy.cplusplus.com/reference/functional/bind/?kw=bind
在这里插入图片描述

总结bind作用:

bind是将函数和其参数进行绑定的工具,可以将一个函数和部分参数绑定在一起,生成一个新的函数对象,这个新的函数对象可以像原函数一样进行调用,但会自动填充绑定的参数。

核心参数补充:
第一个参数 fn
一个function对象,方法指针,或者是类成员变量

第二个参数 args
所有参数的集合列表,要买具体的值,要么placeholders

返回值
就是一个function的对象,当调用时候调用的就是fn这个方法体和带上传递的参数

重点强调一下最后两个:

If fn is a pointer to member, the first argument expected by the returned function is an object of the class *fn is a member (or a reference to it, or a pointer to it).

大概意思是如果fn是一个类成员相关的,那么第一个参数就需要是这个类的引用或者指针。

demo代码:

// bind example
#include <iostream>     // std::cout
#include <functional>   // std::bind

// a function: (also works with function object: std::divides<double> my_divide;)
double my_divide (double x, double y) {return x/y;}

struct MyPair {
  double a,b;
  double multiply() {return a*b;}
};

int main () {
  using namespace std::placeholders;    // adds visibility of _1, _2, _3,...

  // binding functions:
  auto fn_five = std::bind (my_divide,10,2);               // returns 10/2
  std::cout << fn_five() << '\n';                          // 5

  auto fn_half = std::bind (my_divide,_1,2);               // returns x/2
  std::cout << fn_half(10) << '\n';                        // 5

  auto fn_invert = std::bind (my_divide,_2,_1);            // returns y/x
  std::cout << fn_invert(10,2) << '\n';                    // 0.2

  auto fn_rounding = std::bind<int> (my_divide,_1,_2);     // returns int(x/y)
  std::cout << fn_rounding(10,3) << '\n';                  // 3

  MyPair ten_two {10,2};

//这里fn就是类成员方法,第一个参数就要求是这个类的对象,不过这里用的是空缺std::placeholders _1
  // binding members:
  auto bound_member_fn = std::bind (&MyPair::multiply,_1); // returns x.multiply()
  //这里调用时候传递了真正的对象ten_two
  std::cout << bound_member_fn(ten_two) << '\n';           // 20
//这里fn就是类成员变量,第一个参数就要求是这个类的对象
  auto bound_member_data = std::bind (&MyPair::a,ten_two); // returns ten_two.a
  std::cout << bound_member_data() << '\n';                // 10

  return 0;
}

std::placeholders _1,_2…就代表预制第1,2、、、个参数,后续真正调用function对象时候再传递进去

实战使用结合

在这里插入图片描述可以看到这里的mRegistration构造方法第二个参数就是std::bind,即绑定方法,绑定是一个CallbackRepeater::callback的成员方法,而且有3个保留参数,即后续会传递进来的。bind后就变成了function类型对象。那么这里的Registration第二个构造参数是啥呢?

在这里插入图片描述这里的Callback实际就是地道的function对象

  using Callback =
            std::function<void(nsecs_t vsyncTime, nsecs_t targetWakeupTime, nsecs_t readyTime)>;

最后传递到了VSyncDispatchTimerQueueEntry中,在调用VSyncDispatchTimerQueueEntry的callback方法时候会调用上面的function类

在这里插入图片描述
更多framework干货请关注“千里马学框架”

Android车机实现稳定CarPlay的三大技术路径解析 CarPlay本质是一套苹果封闭的二进制车载通信协议,依赖USB CDC/ECM设备类、ECDH密钥协商与AES加密隧道,而Android车机原生缺乏USB Device模式支持、SELinux严格限制及SurfaceFlinger兼容机制,导致‘安卓CarPlay’长期存在高延迟、掉线、黑屏等稳定性问题。本文基于协议栈逆向、AOSP系统层改造与边缘计算网关三种技术范式,深入剖析Linux内核级直通、Framework中间件代理及树莓派外置桥接方案的原理差异、实测性能(端到端延迟38ms~112ms)与工程 阅读详情

相关推荐

CarPlay车机适配:Linux与Android底层通信方案深度对比

CarPlay并非简单投屏,而是基于USB的多通道私有协议栈,涵盖CDC ACM控制、MTP数据同步、HID硬件交互及YUV音频视频流传输。其技术核心在于操作系统对USB Device模式、低延迟ALSA音频调度、HID事件注入和Framebuffer直写等底层能力的支持。Linux提供全链路可控性,适合无官方SDK的Rockchip等平台;Android依赖HAL与vendor分区,适配高通SA8155P等新平台但受SELinux与Bootloader限制。实际落地需匹配USB PHY电气特性、定制内核G

weixin_34393428的博客 425

C++11 bind函数

bind函数的使用详解 可以将bind函数看作是一个通用的函数适配器,它接受一个可调用对象,生成一个新的可调用对象来“适应”原对象的参数列表。 调用bind的一般形式:auto newCallable = bind(callable,arg_list);` 其中,newCallable本身是一个可调用对象,arg_list是一个逗号分隔的参数列表,对应给定的callable的参数。即,当我们调用n......

青山绿水 1万+

鸿蒙操作系统内核架构与分布式设计原理

操作系统架构是构建稳定、可扩展、跨设备协同系统的基石。鸿蒙(HarmonyOS)作为面向全场景的实时分布式操作系统,其核心在于分层解耦的运行时态架构与混合微内核设计原理。它通过Capability权限模型实现动态能力裁剪与安全隔离,依托DSoftBus软总线和分布式调度器达成低延迟设备协同,同时以ArkTS运行时契约和HDF硬件抽象层支撑确定性性能与硬件兼容性。这些技术价值广泛应用于智能终端、车载系统、工业控制及IoT边缘设备等对实时性、安全性与多端一致性要求严苛的工程场景。本书正是深入理解鸿蒙内核机制与分

weixin_34314962的博客 369

C++学习笔记:函数绑定器(bind用法)

STL绑定器bind 成员函数绑定器mem_fn

qq_45834144的博客 3685

C++(11):bind

bind函数可以将既有函数的参数绑定起来,从而生成一个函数对象: 如果函数有多个参数,可以只绑定部分参数,然后通过placeholders::_1标示调用函数对象时的参数占位符: 通过bind还可以绑定类的成员函数: 需要说明的是:1.对于绑定的参数(上例中的p)是传值的方式绑定2.对于placeholders是以传引用的榜示绑定3.如果需要对绑定的参数以传引用的方式绑定,可以通过ref实现......

风静如云的博客 3039

对C++中function和bind用法一窍不通?别担心,看完这篇文章就搞定了!

在设计回调函数的时候,无可避免地会接触到可回调对象。在C++11中,提供了std::function和std::bind两个方法来对可回调对象进行统一和封装。C++语言中有几种可调用对象:函数、函数指针、lambda表达式、bind创建的对象以及重载了函数调用运算符的类。和其他对象一样,可调用对象也有类型。例如,每个lambda有它自己唯一的(未命名)类类型;函数及函数指针的类型则由其返回值类型和实参类型决定。function保存函数的三个方式:保存普通函数、保存lambda表达式、保存成员函数;

Lion_Long的博客 2281

Android 之永乐大典

如下编译脚本逻辑,这里通过DISABLE_DEXPREORT_CHECK宏控来失能是否进行DEXPREOPT优化检测,如果为true则失能,默认需要进行优化检测,通过过滤所有PRODUCT_PACKAGES安装的应用,即先过滤ALL_DEFAULT_INSTALLED_MODULES宏控指定列表里面的应用,然后在过滤DEXPREOPT_SYSTEMSERVER_ARTIFACTS列表中指定的需要dexpreort优化的系统jar。Android DexOpt前世今生:参考。

qq_27672101的博客 1899

AI大模型与碳足迹评估结合模式及示范案例

AI大模型与碳足迹评估相结合,可以提供更精确、更快速的碳排放量计算,优化减排策略,并促进可持续发展目标的实现。

贾贾的博客 3943

【设计模式精讲】10.适配器模式(Adapter)

调度器要一个「只许尾进头出」的队列,手里只有全能的 std::vector——用 insert 插队、用下标越权访问都合法,「只能两端进出」沦为口头约定,评审根本防不住。本文从 std::queue 这个标准库里名字就叫「容器适配器」的现成例子讲起,指出接口不匹配的两个方向:通用接口太全能时靠收窄,两边形状不合且改不动时靠翻译;随后以新调度框架接入 C 风格老调度库为主线,讲透类适配器(私有继承)与对象适配器(组合)的取舍,覆盖错误码换异常、RAII 包装 C API、攒批保序、泛型模板与回调蹦床五种工程改

码工许师傅 332

win11下的MySQL安装

目前官方最新版本是8.0.26,考虑到其稳定性、可靠性还需一定周期保证,所以使用官方版求稳定仍然建议5.7系列。3、选择MySQL Servers 5.7.38 -x64,然后按绿色箭头将选中的版本移植到右边选中框中。4、点击下方蓝色Advanced Options,选择安装位置。1、在开始界面搜索MySQL,点击command line。4、在“系统变量”中选择“path”,点击编辑。5、新建——>增加MySQL路径——>确定,12、execute,安装好后next。9、不需要做修改,直接点击next。.

rensweet的博客 2万+

PotPlayer 史诗级更新!实时字幕生成+实时翻译,看片真的无敌了!

potplayer已经更新实时字幕生成+实时字幕翻译功能

阿虚同学的博客 1万+

Linux/Android车机CarPlay协议模拟器开发实战

CarPlay并非简单投屏协议,而是一套基于USB/Wi-Fi、融合Bonjour服务发现、TLS加密通道与HAP协议栈的汽车级嵌入式通信框架。其核心依赖L4传输层的TLS 1.2安全握手、L5会话层的HAPv2密钥派生机制,以及L6表示层私有Protocol Buffer序列化——尤其iOS 17新增multi_display_config等未公开字段,导致兼容性断层频发。该技术方案聚焦工程落地,提供可部署于ARM Linux(glibc+systemd)及Android AOSP 12L+(NDK r2

weixin_34248705的博客 351

DANN实战:用Python手把手教你实现对抗迁移学习(附完整代码)

本文通过Python实战教程,手把手教你实现DANN对抗迁移学习模型,以解决领域偏移问题。文章详细解析了领域对抗神经网络的核心机制,包括梯度反转层和领域判别器的构建,并提供了从数据准备、模型搭建到训练评估的完整代码,帮助开发者快速掌握这一强大的无监督领域自适应技术。

net55的博客 317

Axmol RHI重写:Compute Shader与GPU并行计算实战指南

现代图形引擎正从固定管线向可编程GPU计算演进,RHI(渲染硬件接口)作为抽象层,成为跨平台高性能渲染的核心基础设施。其核心原理在于解耦上层逻辑与底层API,通过能力集探测、Descriptor Set资源绑定和Pipeline State Object等机制,统一管理OpenGL/Vulkan/Metal等后端差异。技术价值体现在显著降低CPU-GPU协同开销、提升多平台兼容性,并释放GPU的通用计算能力。典型应用场景包括实时粒子系统、医学影像体绘制、AR多源图像融合及工业传感器数据聚合等对并行吞吐与低延

weixin_34293246的博客 293

AI大模型驱动的智能座舱研发体系重构

AI大模型正重构智能座舱研发体系的核心逻辑,需以场景认知为起点、混合架构为支柱、AI原生生态为落脚点。未来,研发体系需持续融合认知科学、边缘计算与开放生态理论,推动座舱从“工具”进化为“伙伴”。

我的专栏 1916

从交换机安全配置,看常见局域网攻击

前言 构建零信任网络,自然离不开网络准入(NAC),这就涉及到交换机的一些安全测试,于是有了此文《从交换机安全配置看常见局域网攻击》。 交换机安全配置 如本文标题所说从交换机安全配置看常见的局域网攻击,那么下面提到的各种攻击方式,自然是建立在交换机安全配置之上来说的。我们通过h3c官方提供的《H3C 交换机安全加固手册》和《安全配置指导》,从这两份手册可以看出交换机支持的安全配置非常多,基本已经覆盖了各种我们熟知局域网攻击。下面就挑几个典型的攻击方式进行演示。 arp欺骗 【一>所有资源获取&lt

kali_Ma的博客 1万+

note

CPU,此处CPU与BL芯片断开,没有连背光芯片。屏,此处屏与BL芯片断开,没有连背光芯片。虽然signal函数更简单些。行 3744: 07-22 23:56:01.139 <6>[ 5.577037][ T919] [2024:07:22 15:55:51](7)[919:modprobe][drm] [lcdkit /I]: type:66, name:[qcom,mdss-dsi-apl-bl-mode-off-command], length:16, pkt-count=1。

m0_73462935的博客 10万+

AI 模型优化与部署秘籍:从理论到实战

本文系统介绍了AI模型优化与部署的关键技术。模型剪枝通过去除冗余参数减小模型规模,量化技术降低计算精度以提升效率,蒸馏方法实现知识从大模型到小模型的迁移。TensorRT通过层融合和精度校准加速GPU推理,ONNX格式实现跨框架模型转换,TFLite则优化移动端部署。这些技术共同解决了AI模型在资源受限环境下的部署难题,显著提升了模型运行效率,为AI应用落地提供了重要支撑。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 246

WebUSB免安装投屏:Chrome侧边栏直连Android原理与实践

WebUSB 是现代浏览器提供的底层 USB 设备访问能力,它绕过操作系统驱动和 ADB 协议栈,让网页直接与 Android 设备建立安全、低延迟的 USB 通信通道。其核心原理基于 Chromium 内核集成的精简 USB Host Controller Driver,通过 `navigator.usb` API 实现设备枚举、权限协商与零拷贝数据传输。相比传统 QtScrcpy 等本地工具,WebUSB 具备免部署、免驱动、免环境配置的技术价值,特别适用于跨平台快速验证、客户现场演示及企业级轻量集成场

weixin_34210740的博客 170

【思考模型框架】MECE原则,确保分析时,考虑到的所有因素,既不重叠又无遗漏

MECE原则,是Mutually Exclusive and Collectively Exhaustive的缩写,中文译为“相互独立、完全穷尽”。MECE原则,这是一种逻辑思维和组织信息的方法,旨在确保分析时既没有遗漏也没有重复。MECE原则,相互独立、完全穷尽(Mutually Exclusive,Collectively Exhaustive)的原则MECE原则,确保分析时考虑到的所有因素既不重叠又无遗漏。

奶爸的编程之路,也就一周冷个三天 2753

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

C++bind

C++11中提供了std::bind。bind()函数的意义就像它的函数名一样,是用来绑定函数调用的某些参数的。 bind的思想实际上是一种延迟计算的思想,将可调用对象保存起来,然后在需要的时候再调用。而且这种绑定是非常灵活的,不论是普通函数、函数对象、还是成员函数都可以绑定,而且其参数可以支持占位符,比如你可以这样绑定一个二元函数auto f = bind(&func, _1, _2)

L. 4077

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

C/C++编程:bind参数绑定

lambda表达式的缺点 引入lambda表达式的原因: 像算法传递谓词时,由于一般的函数无法传递参数以外的信息,函数对象又比较麻烦,所以引入了lambda表达式 但是lambda表达式也有缺点: 在类似功能多次使用的时候,每次定义lambda表达式也会比较麻烦 因此,C++11又引入了新特性:参数绑定 标准库的bind函数 继续用lambda表达式中用过的例子,如果希望找到第一个长度小于2的string,可以使用以下代码: bool istarget(const string& s){

OceanStar的博客 2841

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++bind函数

其中,f1绑定了三个占位符,表示需要传入三个参数;f2绑定了两个占位符和一个常量100,表示需要传入两个参数,其中第一个参数在print函数中对应第二个参数,第二个参数在print函数中对应第一个参数,第三个参数固定为100;f3绑定了三个占位符和一个常量100,表示需要传入三个参数,其中第一个参数在print函数中对应第三个参数,第二个参数固定为100,第三个参数在print函数中对应第二个参数。bind函数是C++11标准中的一个函数模板,用于将函数和一组参数绑定在一起,生成一个新的可调用对象。

ZZU_LGY 1758

c++ bind函数与function函数简介及使用方法

c++十一标准bind的简单使用介绍

weixin_61899680的博客 2825
上一篇: Ubuntu上VScode编译c++基础学习指南-SurfaceFlinger实战必备基础知识
下一篇: hal/SurfaceFlinger/perfetto实战需求问题探讨作业-千里马framework开发
千里马学框架
博客等级 码龄6年 1万+粉丝 650原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

千里马学框架

帮助你了,就请我喝杯咖啡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值