std::function vs 函数指针

std::function vs function pointer

std::function 更通用——您可以在其中存储任何具有正确签名的可调用对象(函数指针、方法指针、具有 operator() 的对象),并且您可以构造 std::function 使用std::bind.

函数指针只能接受具有正确签名的函数,但速度可能会稍快一些,并且生成的代码可能会略小一些。

在非捕获 lambda 的情况下,使用函数指针比使用 std::function 更快。这是因为 std::function 是一种更通用的野兽,它使用类型擦除来存储传递给它的函数对象。它通过类型擦除实现这一点,这意味着您最终调用 operator() 是虚拟的。

OTOH,非捕获 lambda 可以隐式转换为相应的函数指针。但是,如果您需要一个完整的闭包,则必须尽可能将 lambda 分配给 std::function,或者通过模板进行类型推导。