std :: function vs function pointer

时间:2015-01-12 08:27:16

标签: c++ function-pointers std-function

  • 有什么不同吗?

  • “保存/转移”功能的最佳方法是什么?

    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);
    

2 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:5)

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

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