首页  >  文章  >  后端开发  >  std::function 与函数指针:什么时候应该在 C 中选择每个函数?

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

Susan Sarandon
Susan Sarandon原创
2024-11-12 07:38:01484浏览

 std::function vs. Function Pointers: When Should You Choose Each in C  ?

C 中的 std::function 与函数指针:选择哪个以及何时选择?

当涉及到在 C 中定义回调函数时,您有两个主要选项:C 风格函数指针和 std::function。这种选择可以显着影响代码的功能和效率。

C 风格函数指针

函数指针已经存在很长时间并且仍然被广泛使用。它们提供了存储指向函数的指针的简单性:

void (*callbackFunc)(int);

但是,它们有一个显着的限制:

缺乏上下文捕获:函数指针不能保留父函数的上下文(例如,捕获的变量)。这意味着您无法轻松传递 lambda 函数或调用对象的成员函数作为回调。

std::function

std::function (在 C 11 中引入)是旨在克服这些限制。它提供了一种类型安全、通用的方式来存储和传递函数:

std::function< void(int) > callbackFunc;

std::function 的优点:

  • Context捕获:std::function 可以捕获父函数的上下文,从而可以使用 lambda 或成员函数指针。
  • 存储:std::function 可以存储在数据成员,使其适合回调注册和持久函数存储。
  • 通用兼容性:它适用于所有可调用对象,包括函数指针、函子和 lambda。

std::function 的缺点:

  • 调用开销:与直接函数调用相比,调用 std::function 会产生轻微的性能开销.
  • 非内联:与直接函数调用不同,默认情况下对 std::function 的调用不是内联的。

模板参数

第三种选择,特别适合小型函数,是使用可调用对象类型的模板参数:

template <typename CallbackFunction>
void myFunction(..., CallbackFunction && callback) {
    ...
    callback(...);
    ...
}

模板参数的优点:

  • 内联:对回调函数的调用是内联的,提高性能。
  • 上下文捕获:也允许捕获上下文.

模板参数的缺点:

  • 标头实现要求:包含模板参数的函数必须实现在标头中以支持完整类型信息。

汇总表

总而言之,下表概述了这些选项之间的主要区别:

Feature Function Pointer std::function Template Parameter
Context Capture No Yes Yes
Call Overhead No Yes No
Inlining No No Yes
Class Member Storage Yes Yes No
C 11 Support Yes No Yes
Readability Less Readable More Readable Somewhat Readable

大多数情况下,除非您对函数指针或模板参数有特定要求,std::function 是首选,因为它具有灵活性、上下文捕获功能和通用兼容性。

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

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn