首页 > 后端开发 > C++ > 正文

std::function 与函数指针:什么时候应该选择每个?

Linda Hamilton
发布: 2024-11-11 05:24:03
原创
140 人浏览过

std::function vs. Function Pointer: When Should You Choose Each?

C 中的 std::function 与函数指针:做出最佳选择

在 C 中,实现回调函数时,经常会选择出现在使用 C 风格函数指针或 std::function 之间。两种方法各有优缺点,但在大多数情况下,std::function 是更好的选择。

函数指针:有限功能

函数指针,如图所示通过以下代码,有一个基本限制:

void (*callbackFunc)(int);
登录后复制

它们无法捕获上下文变量,从而无法传递依赖于此类变量的 lambda 函数或调用非静态对象数据成员。

std::function:多功能且高效

相比之下,std::function(在 C 11 中引入)允许存储和使用任意类型的函数。它具有以下优点:

  • 上下文变量捕获:Lambda 函数和非静态对象数据成员可以作为回调传递。
  • 否存储开销: std::function 设计用于存储回调,这在将回调存储在类成员中时可能很有用。
  • 函数调用中的少量开销: std::function 产生函数调用的开销很小,但在大多数情况下可以忽略不计。
  • 可读且方便: std::function 促进代码的一致性和可读性,最大限度地减少仔细决策的需要。

模板参数:替代方案

在某些情况下,使用模板参数作为可调用对象可能会很有用。它允许任何可调用对象(函数指针、函子、lambda、std::function 等)作为参数传递。但是,也有一些缺点:

  • 基于标头的实现:外部函数成为模板,必须在标头中实现。
  • 不能存储在类成员中: 模板参数不能存储为类成员。

比较摘要

下表比较了每种方法的优点和缺点:

Feature Function Pointer std::function Template Parameter
Context variable capture No¹ Yes Yes
Call overhead No No Yes
Inlining potential No No Yes
Class member storage Yes Yes No²
Header implementation Yes Yes No
C 11 support Yes No³ Yes
Readability No Yes (Yes)

结论

总之,std::function 通常是在 C 中实现回调函数的推荐选择,它提供了多功能性、便利性和最小的开销。函数指针对于特定需求仍然有用,例如无标头实现或有严格的性能要求时。如果灵活性是优先考虑的,那么将模板参数视为可调用对象可能是一个可行的选择。

以上是std::function 与函数指针:什么时候应该选择每个?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板