其中这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());
编辑:如果这样,在什么情况下最好将其他上述方法之一已经制定呢?
非常感谢!
其中这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());
编辑:如果这样,在什么情况下最好将其他上述方法之一已经制定呢?
非常感谢!
函子可以(并且会 )被平凡内联-这不是正规函数指针来完成。
因此,仿函数有可能是在紧密循环巨大的一个真正的性能优势。 此外,仿函数通常更容易组合,可在particuler与STL发挥更好: std::bind
x
不会对函数指针工作,例如。
我恨他们是如何混乱的代码,但给定的所有优点,我宁愿他们在函数指针的任何时间。
要清除了一个什么样的编译器可以内联的误解,一个足够好的编译器可以内联函数指针。 它可以只是内联函数对象更容易,因为还有更多的静态信息。 例如,一个指向不带参数,返回一个布尔值的函数的类型是布尔(*)(),而仿函数有一个明确的类型,即仿函数和模板实例可以静态调用仿函数操作,而比具有通过函数指针调用。
但在实践中,这主要是给编译器足够的信息有效地优化的问题。
例如,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]
在一个函数指针的函数对象的一个大好处是,你可以更轻松地在函数对象绑定建设了一些争论。
可能做这个函子的一个例子是
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 ::绑定和促进::功能 ,如果刺激是提供给您。
我的意见 - #1比较好,因为它更简单。
仅仅因为一些可以是对象,但这并不意味着它应该是一个。 我敢肯定有其中的仿函数是有道理的案件,但在大多数情况下,可能没有必要吧。
仿函数可以更容易地内联 ,所以它可能是考虑性能的时候是很重要的一个因素。
#1是简单的声明函数
而2号函子看起来更像是一个函数调用。
(有时你必须到C的绝望++语法)