Mon*_*urd 15 c++ functor function-object
在wikipedia 关于函数对象的文章中,它说这些对象在与for_each一起使用时具有性能优势,因为编译器可以"内联"它们.
我对这在这种情况下的意义有点模糊......或者我不好意思说的任何背景.谢谢你的帮助!
AnT*_*AnT 14
for_each模板的最后一个参数是仿函数.Functor是可以使用()运算符(可能带参数)"调用"的东西.根据定义,有两种不同的仿函数:
()运算符的类类型的对象(所谓的函数对象)也是仿函数.现在,如果你想使用普通函数作为函子for_each,它看起来像下面这样
inline void do_something(int &i) { /* do something */ }
int main() {
int array[10];
std::for_each(array, array + 10, &do_something);
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,for_each模板使用[推导]参数进行实例化<int *, void (*)(int &)>.请注意,在这种情况下,实际的函子值是&do_something作为函数参数传递的函数指针.从功能的角度来看,for_each这是一个运行时值.由于它是一个运行时值,因此无法内联对仿函数的调用.(就像通常情况下不可能内联通过函数指针进行的任何调用一样).
但是,如果我们使用函数对象,代码可能如下所示
struct do_something {
void operator()(int &i) { /* do something */ }
};
int main() {
int array[10];
std::for_each(array, array + 10, do_something());
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,for_each模板使用[推导]参数进行实例化<int *, do_something>.从内部对仿函数的调用for_each将被引导至do_something::operator().调用的目标是已知的,并在编译时修复.由于目标函数在编译时是已知的,因此可以很容易地内联调用.
在后一种情况下,我们当然也有一个作为参数传递的运行时值for_each.它是do_something我们调用时创建的[可能是"虚拟"临时] 类的实例for_each.但是此运行时值对调用的目标没有影响(除非operator ()是虚拟的),因此它不会影响内联.