Rendimiento de std :: function en comparación con el puntero de función raw y void * this?
Código de la biblioteca:
class Resource
{
public:
typedef void (*func_sig)(int, char, double, void*);
//Registration
registerCallback(void* app_obj, func_sig func)
{
_app_obj = app_obj;
_func = func;
}
//Calling when the time comes
void call_app_code()
{
_func(231,'a',432.4234,app_obj);
}
//Other useful methods
private:
void* app_obj;
func_sig _func;
//Other members
};
Código de solicitud:
class App
{
public:
void callme(int, char, double);
//other functions, members;
};
void callHelper(int i, char c, double d, void* app_obj)
{
static_cast<App*>(app_obj)->callme(i,c,d);
}
int main()
{
App a;
Resource r;
r.registercallback(&a, callHelper);
//Do something
}
Lo anterior es una implementación mínima del mecanismo de devolución de llamada. Es más detallado, no admite enlaces, marcadores de posición, etc., como std :: function. Si uso unstd::function
oboost::function
Para el caso de uso anterior, ¿habrá algún inconveniente en el rendimiento? Esta devolución de llamada estará en el camino muy crítico de una aplicación en tiempo real. He oído que boost :: function utiliza funciones virtuales para realizar el envío real. ¿Se optimizará si no hay vinculantes / marcadores de posición involucrados?
Actualizar
Para aquellos interesados en inspeccionar los ensamblajes en los últimos compiladores:https://gcc.godbolt.org/z/-6mQvt