std::function vs 函数指针
std::function vs function pointer
有什么不同吗?
哪个是 "save/transfer" 功能的最佳方式?
function<void(int)> fcn =
[](int par) {std::cout<<"fcn: "<<par<<std::endl; };
void(*fcn_a)(int) =
[](int par) {std::cout<<"fcn_a: "<<par<<std::endl; };
fcn(12);
fcn_a(12);
std::function
更通用——您可以在其中存储任何具有正确签名的可调用对象(函数指针、方法指针、具有 operator()
的对象),并且您可以构造 std::function
使用std::bind.
函数指针只能接受具有正确签名的函数,但速度可能会稍快一些,并且生成的代码可能会略小一些。
在非捕获 lambda 的情况下,使用函数指针比使用 std::function
更快。这是因为 std::function
是一种更通用的野兽,它使用类型擦除来存储传递给它的函数对象。它通过类型擦除实现这一点,这意味着您最终调用 operator()
是虚拟的。
OTOH,非捕获 lambda 可以隐式转换为相应的函数指针。但是,如果您需要一个完整的闭包,则必须尽可能将 lambda 分配给 std::function
,或者通过模板进行类型推导。
有什么不同吗?
哪个是 "save/transfer" 功能的最佳方式?
function<void(int)> fcn = [](int par) {std::cout<<"fcn: "<<par<<std::endl; }; void(*fcn_a)(int) = [](int par) {std::cout<<"fcn_a: "<<par<<std::endl; }; fcn(12); fcn_a(12);
std::function
更通用——您可以在其中存储任何具有正确签名的可调用对象(函数指针、方法指针、具有 operator()
的对象),并且您可以构造 std::function
使用std::bind.
函数指针只能接受具有正确签名的函数,但速度可能会稍快一些,并且生成的代码可能会略小一些。
在非捕获 lambda 的情况下,使用函数指针比使用 std::function
更快。这是因为 std::function
是一种更通用的野兽,它使用类型擦除来存储传递给它的函数对象。它通过类型擦除实现这一点,这意味着您最终调用 operator()
是虚拟的。
OTOH,非捕获 lambda 可以隐式转换为相应的函数指针。但是,如果您需要一个完整的闭包,则必须尽可能将 lambda 分配给 std::function
,或者通过模板进行类型推导。