代码之家  ›  专栏  ›  技术社区  ›  Gaurav Sehgal

函数指针与C中的函子++

  •  27
  • Gaurav Sehgal  · 技术社区  · 8 年前

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

      //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
    

    这两种方法都有效,但我相信在某些情况下,一种方法比另一种更好(或可能更好)。

    2 回复  |  直到 8 年前
        1
  •  30
  •   DevSolar    8 年前

    首先,函子可以包含内部状态;对以下情况有效的状态 这个调用 仅用于函数对象。你可以添加 static 变量,但这些变量将用于 任何 函数的调用。

    其次,编译器可以内联调用functor;它不能对函数指针执行相同的操作。这就是为什么C++ std::sort() 击败了C语言的垃圾 qsort() 性能方面。

        2
  •  1
  •   cwschmidt    8 年前

    functor甚至可以在一定程度上模拟lambda表达式(如果必须使用C++11/C++14之前的旧编译器),因为它们可以有单独的状态(例如作为成员变量)。

    struct A {
       int x; // state member can even be made private! Instance per functor possible
       int operator()(int y) { return x+y }
    };
    

    或作为lambda

    auto lambda = [&x](int y) { return x+y };
    

    函数指针只能获取参数,但是无状态的,除非它们访问任何全局变量(这是非常糟糕的设计和危险的)。

    // global scope, anyone can accidentally manipulate and not thread-safe here, only one global instance possible!
    inx x; 
    int (func)(int y) { return x+y };