Desempenho de std :: function comparado ao ponteiro de função bruta e void * this?
Código da 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 da Aplicação:
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
}
O acima é uma implementação mínima do mecanismo de retorno de chamada. É mais detalhado, não suporta vinculação, espaços reservados etc., como std :: function. Se eu usar umstd::function
ouboost::function
para o caso acima, haverá alguma desvantagem de desempenho? Este retorno de chamada estará no caminho muito crítico de um aplicativo em tempo real. Ouvi dizer que o boost :: function usa funções virtuais para fazer o despacho atual. Isso será otimizado se não houver vinculação / espaços reservados envolvidos?
Atualizar
Para aqueles interessados em inspecionar os assemblies nos últimos compiladores:https://gcc.godbolt.org/z/-6mQvt