Para aclarar una idea errónea de lo que puede compilar un compilador, un compilador suficientemente bueno puede insertar punteros de función. Puede alinear los objetos de función más fácilmente ya que hay más información estática disponible. Por ejemplo, un puntero a una función que no toma parámetros y devuelve un bool es de tipo bool (*)(), mientras que un funtor tiene un tipo explícito, es decir, el funtor, y la instanciación de la plantilla puede llamar estáticamente al operador del functor, que tener que llamar a través de un puntero de función.
En la práctica, sin embargo, es principalmente una cuestión de dar al compilador información suficiente para optimizar con eficacia.
Por ejemplo, Visual C++ 2008, da el siguiente código con optimizaciones completos:
#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;
}
inlines ambos std::for_each
llamadas por completo. Por cierto, en la PC, el primer for_each tiene un lea ecx, [ecx]
innecesario.
¿En qué sentido juegan mejor con los algoritmos STL? –
Ver mi actualización. Básicamente, su enlace es el problema aquí. –
No std :: ptr_fun se ocupa de cómo usar un puntero de función con std :: bindXXX? – MSN