函数指针与 std::function:在 C 回调实现中选择正确的方法
在 C 中,当实现回调函数时,有有两个主要选项:传统的 C 风格函数指针和较新的 std::function 类。每种方法都有其优点和缺点,导致不同的场景,其中一种可能比另一种更适合。
C 风格函数指针
传统 C 风格函数指针方法涉及如下定义函数指针:
void (*callbackFunc)(int);
这种方法有一个关键的限制:它无法捕获上下文变量。这意味着您不能将 lambda 函数或对象成员函数作为回调传递,因为它们通常需要捕获额外的上下文。
std::function
相反,std: :C 11 中引入的函数类提供了更通用的方法。它可以保存任何可调用对象,包括 lambda 函数、函数指针和函子。这允许您捕获上下文变量并将它们传递给回调函数。
使用 std::function 作为默认选择
在大多数情况下,建议由于其灵活性和便利性,使用 std::function 进行回调实现。它处理所有必要的设置,并允许更具可读性和一致性的代码。
考虑模板参数进行性能优化
但是,在某些情况下,性能可能是一个问题。在这种情况下,使用模板参数直接接受可调用对象可以通过允许内联回调调用来提供更好的性能。
函数指针、std::function 和模板的比较参数
总而言之,这里是三个选项的比较:
Feature | Function Pointer | std::function | Template Parameter |
---|---|---|---|
Capture context variables | No | Yes | Yes |
Call overhead (in most cases) | No | Yes | No |
Can be inlined (in certain situations) | No | No | Yes |
Can be stored in a class member | Yes | Yes | No |
Supported in pre-C 11 | Yes | No | Yes |
Readability and ease of use | Low | High | (High) |
以上是函数指针与 std::function:什么时候应该为 C 回调选择每个指针?的详细内容。更多信息请关注PHP中文网其他相关文章!