std :: function vs function pointer

Per*_*kie 4 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);
    
    Run Code Online (Sandbox Code Playgroud)

tum*_*dum 6

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

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


Pra*_*han 5

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

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