使用STL的算法,是它更好地传递一个函数指针或仿函数?(Using STL algorithms,

2019-07-29 02:25发布

其中这2种方法更好,为什么?

方法1:

void fun(int i) {
  //do stuff
}

...
for_each(a.begin(), a.end(), fun);

方法2:

class functor {
public:
  void operator()(int i);
};

...
for_each(a.begin(), a.end(), functor());

编辑:如果这样,在什么情况下最好将其他上述方法之一已经制定呢?

非常感谢!

Answer 1:

函子可以(并且 )被平凡内联-这不是正规函数指针来完成。

因此,仿函数有可能是在紧密循环巨大的一个真正的性能优势。 此外,仿函数通常更容易组合,可在particuler与STL发挥更好: std::bind x不会对函数指针工作,例如。

我恨他们是如何混乱的代码,但给定的所有优点,我宁愿他们在函数指针的任何时间。



Answer 2:

要清除了一个什么样的编译器可以内联的误解,一个足够好的编译器可以内联函数指针。 它可以只是内联函数对象更容易,因为还有更多的静态信息。 例如,一个指向不带参数,返回一个布尔值的函数的类型是布尔(*)(),而仿函数有一个明确的类型,即仿函数和模板实例可以静态调用仿函数操作,而比具有通过函数指针调用。

但在实践中,这主要是给编译器足够的信息有效地优化的问题。

例如,Visual C ++ 2008,给定具有完全优化以下代码:

#include "stdafx.h"
#include <algorithm>

const char print_me[]= "hello!";

class print_functor
{
public:
    void operator()(char c)
    {
        printf("%c", c);
    }
};

void print_function(char c)
{
    printf("%c", c);
}

int _tmain(int argc, _TCHAR* argv[])
{
    std::for_each(print_me, print_me + sizeof(print_me)/sizeof(print_me[0]), print_functor());
    printf("\n");

    std::for_each(print_me, print_me + sizeof(print_me)/sizeof(print_me[0]), print_function);

    return 0;
}

内联两个std::for_each完全调用。 顺便说一下,在PC上,所述第一的for_each具有不必要lea ecx, [ecx]



Answer 3:

在一个函数指针的函数对象的一个​​大好处是,你可以更轻松地在函数对象绑定建设了一些争论。

可能做这个函子的一个例子是

  class multiplyBy
  {
  private:
      int m_whatToMultiplyBy;
  public:
      multiplyBy(int whatToMultiplyBy) : 
          m_whatToMultiplyBy(whatToMultiplyBy)
      {
      }

      void operator()(int& i)
      {
          i = m_whatToMultiplyBy * i;
      }
  }


  ...

  // double the array
  for_each(a.begin(), a.end(), multiplyBy(2));

这个论点“结合”可以很好地完成的boost ::绑定和促进::功能 ,如果刺激是提供给您。



Answer 4:

我的意见 - #1比较好,因为它更简单。

仅仅因为一些可以是对象,但这并不意味着它应该是一个。 我敢肯定有其中的仿函数是有道理的案件,但在大多数情况下,可能没有必要吧。



Answer 5:

仿函数可以更容易地内联 ,所以它可能是考虑性能的时候是很重要的一个因素。



Answer 6:

#1是简单的声明函数
而2号函子看起来更像是一个函数调用。

(有时你必须到C的绝望++语法)



文章来源: Using STL algorithms, is it better to pass a function pointer or a functor?
标签: c++ stl functor