C'è sovraccarico utilizzando lambda ricorsivamente memorizzando come std::function
, anche se sono fondamentalmente stessa funtori. Sembra che gcc
non sia in grado di ottimizzare bene il che può essere visto in diretta comparison.
L'implementazione del comportamento di una lambda, ovvero la creazione di un functor, abilita nuovamente l'ottimizzazione gcc
. Il tuo esempio specifico di un lambda potrebbe essere implementato come
struct HelloWorldFunctor
{
void operator()(int count) const
{
std::cout << "Hello world" << std::endl;
if (count > 1)
{
this->operator()(count - 1);
}
}
};
int main()
{
HelloWorldFunctor functor;
functor(2);
}
Per l'esempio ho creato il funtore sarebbe simile in questo second demo.
Anche se si introduce chiamate a funzioni quali impuri std::rand
, le prestazioni senza un ricorsiva lambda o con un funtore personalizzato è ancora meglio. Ecco uno third demo.
Conclusione: con l'utilizzo di un std::function
, c'è un sovraccarico, anche se potrebbe essere trascurabile a seconda del caso d'uso. Poiché questo utilizzo impedisce alcune ottimizzazioni del compilatore, questo non dovrebbe essere ampiamente utilizzato.
Il tuo problema principale sarà una minore ottimizzazione del compilatore http://ideone.com/QsZVfH – stefan
Bello! Hai un'idea del perché? Il compilatore non ha potuto solo intuire che questo codice è simile a una normale chiamata di funzione (no-capture ma stessa)? – 3XX0
@fscan Devo perché è una funzione lambda ricorsiva. L'inferenza di tipo non funziona qui – 3XX0