全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

c++的std::function和函数指针有什么区别 类型擦除技术【现代c++】

c++kquote>std::function 是基于类型擦除的通用可调用对象包装器,支持存储、复制和调用函数、lambda、成员函数等;函数指针仅能存储无状态的普通函数地址,类型严格且无运行时开销。

std::function 是类型擦除的通用可调用对象包装器

std::function 不是一个指针,而是一个类模板,能存储、复制和调用任意可调用对象:普通函数、成员函数、lambda 表达式、bind 表达式等。它内部使用类型擦除技术——把不同类型的可调用体统一转换为一个私有基类接口,再通过虚函数或函数指针跳转实现统一调用。这意味着你写 std::function,就能装 [](int x){return x+1;}&abs、甚至 std::bind(&X::f, obj, _1)

函数指针是 C 风格的、类型严格的地址引用

函数指针(如 int(*)(int))只保存某个具名函数的内存地址,不带状态、不能捕获变量、无法绑定对象或参数。它要求签名完全匹配:返回类型、参数个数与类型都必须一致。比如 void f(int) 的指针不能赋给 void(*)(double),哪怕只是参数类型微调也不行。它轻量(通常就是一个指针大小),无额外开销,但能力非常受限。

关键差异体现在五个方面

  • 可存储内容不同:函数指针只能存普通非成员函数;std::function 还能存 lambda(含捕获)、成员函数指针(需配合对象)、bind 结果等
  • 类型安全性不同:函数指针类型由签名决定,强制编译期检查;std::function 在构造/赋值时做运行期兼容性检查(不匹配会抛 std::bad_function_call 或编译失败)
  • 性能开销不同:函数指针调用是直接跳转,零开销;std::function 调用至少有一次间接跳转(可能涉及虚函数表或函数指针查表),还带一小段管理内存(小对象优化前可能堆分配)
  • 拷贝与生命周期管理:函数指针拷贝就是复制地址;std::function 拷贝会深拷贝其内部存储的可调用对象(如 lambda 捕获的数据)
  • 空值语义明确:两者都支持判空(if (f)),但 std::function 空态调用会抛异常,函数指针空值解引用是未定义行为

类型擦除在 std::function 中怎么工作

std::function 内部定义了一个抽象基类(如 std::function::impl_base),声明了 invokecopydestroy 等虚函数。每种可调用类型(比如 lambda)都会生成一个具体派生类,实现这些接口。构造时,std::function 根据传入对象类型 new 出对应派生类实例,并保存指向它的指针(或小对象优化进内部缓冲区)。调用 operator() 时,实际走的是虚函数 dispatch,从而屏蔽底层类型差异。

这种设计让接口统一,代价是失去了编译期单态(monomorphic)优化机会——编译器看不到真实调用目标,难以内联。不过现代 libstdc++/libc++ 对小可调用对象(如无捕获 lambda)做了 SSO(small buffer optimization),避免堆分配,缓解部分开销。


# c++  # 区别  # if  # 成员函数  # int  # double  # void  # Lambda  # 指针  # 虚函数  # 接口  #   # 类模板  # 指针类型  # operator  # copy  # function  # 对象  # 跳转  # 擦除  # 的是  # 派生类  # 就能  # 还能  # 有一次  # 不带  # 体现在  # 转换为 


相关文章: 网站建设设计制作营销公司南阳,如何策划设计和建设网站?  建站主机解析:虚拟主机配置与服务器选择指南  怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?  免费网站制作模板下载,除了易企秀之外还有什么H5平台可以制作H5长页面,最好是免费的?  上海网站制作网站建设公司,建筑电工证网上查询系统入口?  如何使用Golang table-driven基准测试_多组数据测量函数效率  内部网站制作流程,如何建立公司内部网站?  微信h5制作网站有哪些,免费微信H5页面制作工具?  如何在万网自助建站中设置域名及备案?  网站制作报价单模板图片,小松挖机官方网站报价?  如何快速上传自定义模板至建站之星?  高端智能建站公司优选:品牌定制与SEO优化一站式服务  如何制作算命网站,怎么注册算命网站?  香港服务器建站指南:免备案优势与SEO优化技巧全解析  建站主机功能解析:服务器选择与快速搭建指南  厦门模型网站设计制作公司,厦门航空飞机模型掉色怎么办?  制作网站怎么制作,*游戏网站怎么搭建?  如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?  公司门户网站制作流程,华为官网怎么做?  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  C#如何在一个XML文件中查找并替换文本内容  建站上市公司网站建设方案与SEO优化服务定制指南  ,南京靠谱的征婚网站?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  如何高效搭建专业期货交易平台网站?  如何在阿里云虚拟服务器快速搭建网站?  标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?  Java解压缩zip - 解压缩多个文件或文件夹实例  建站主机空间推荐 高性价比配置与快速部署方案解析  h5网站制作工具有哪些,h5页面制作工具有哪些?  香港服务器网站卡顿?如何解决网络延迟与负载问题?  图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?  如何通过智能用户系统一键生成高效建站方案?  定制建站流程步骤详解:一站式方案设计与开发指南  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  如何通过VPS建站实现广告与增值服务盈利?  如何制作公司的网站链接,公司想做一个网站,一般需要花多少钱?  如何在万网自助建站平台快速创建网站?  如何选择适合PHP云建站的开源框架?  宝塔Windows建站如何避免显示默认IIS页面?  网站app免费制作软件,能免费看各大网站视频的手机app?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  C++如何使用std::optional?(处理可选值)  大连网站设计制作招聘信息,大连投诉网站有哪些?  建站为何优先选择香港服务器?  如何选择高效可靠的多用户建站源码资源?  如何通过主机屋免费建站教程十分钟搭建网站?  Android自定义listview布局实现上拉加载下拉刷新功能  桂林网站制作公司有哪些,桂林马拉松怎么报名?  如何设置并定期更换建站之星安全管理员密码? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。