C++中的函数指针vs仿函数

Gau*_*gal 15 c++ function-pointers functor

使用函子和函数指针有什么区别.例如

  //Functor
  struct add_x
  {
    int x;
    add_x(int y):x(y){}
    int operator()(int y)
    {
       return x+y;
    }
  };
  //Function
  int (func)(int x)
  {
     return ++x;
  }
  std::vector<int> vec();
  //fill vec with 1 2 3 4 5
  int (*f)(int) = func;//Function pointer
  std::transform(vec.begin(),vec.end(),f); //approach 1
  std::transform(vec.begin(),vec.end(),add_x(1)); //approach 2
Run Code Online (Sandbox Code Playgroud)

这两种方法都有效,但我确信会有一种方法比其他方法更受欢迎(或可能).

Dev*_*lar 14

首先,仿函数可以包含内部状态; 仅对此函数对象的调用有效的状态.您可以static向函数添加变量,但这些变量将用于函数的任何调用.

其次,编译器可以内联对仿函数的调用; 它对函数指针不能做同样的事情.这就是为什么C++ std::sort()qsort()性能方面胜过C 的原因.

  • 你能解释一下为什么函数指针调用不能内联吗? (2认同)
  • @GauravSehgal:请允许我向您指出 [这个答案](http://stackoverflow.com/questions/2225643)。 (2认同)
  • 粗略地说,内联依赖于编译器可见的调用者和被调用者的定义。传递函数指针意味着编译器不太可能拥有它需要内联的信息(例如,`qsort()` 是在不可见传递给它的实际函数的情况下构建的)。在风格上,函子通常用于编译器对其定义具有完全可见性的情况,因此它可以内联。如果编译器对另一个编译单元中的定义(函子的 `operator()` 等)没有完整的可见性,则可以防止函子的内联。 (2认同)