C 中的 std::function 与函数指针:做出最佳选择
在 C 中,实现回调函数时,经常会选择出现在使用 C 风格函数指针或 std::function 之间。两种方法各有优缺点,但在大多数情况下,std::function 是更好的选择。
函数指针:有限功能
函数指针,如图所示通过以下代码,有一个基本限制:
void (*callbackFunc)(int);
它们无法捕获上下文变量,从而无法传递依赖于此类变量的 lambda 函数或调用非静态对象数据成员。
std::function:多功能且高效
相比之下,std::function(在 C 11 中引入)允许存储和使用任意类型的函数。它具有以下优点:
模板参数:替代方案
在某些情况下,使用模板参数作为可调用对象可能会很有用。它允许任何可调用对象(函数指针、函子、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中文网其他相关文章!