【问题标题】:std::function vs function pointer [duplicate]std::function vs 函数指针[重复]
【发布时间】:2015-03-09 23:25:19
【问题描述】:
  • 有什么不同吗?

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

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

【问题讨论】:

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


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-06-14
        • 2011-06-13
        • 1970-01-01
        • 2021-12-22
        • 1970-01-01
        • 2017-08-27
        相关资源
        最近更新 更多