Istnieje narzut za pomocą lambdy rekurencyjnie poprzez przechowywanie go jako std::function
, chociaż są one w zasadzie się funktory. Wygląda na to, że gcc
nie jest w stanie zoptymalizować dobrze, co można zaobserwować w bezpośrednim comparison.
Wdrażanie zachowania lambda, czyli tworzenie funktora, umożliwia ponowną optymalizację gcc
. Twój Konkretnym przykładem lambda mogą być realizowane jako
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);
}
Dla przykładu stworzyłem funktor będzie wyglądać w tym second demo.
Nawet jeśli ktoś wprowadza połączenia do nieczystych funkcji, takich jak std::rand
, wydajność bez rekurencyjne lambda lub z niestandardowym funktora jest jeszcze lepiej. Oto third demo.
Wniosek: przy użyciu numeru std::function
jest on narzutowy, choć może być pomijalny w zależności od przypadku użycia. Ponieważ to użycie zapobiega optymalizacji niektórych kompilatorów, nie należy tego używać w znacznym stopniu.
Twoim głównym problemem będzie mniejsza optymalizacja kompilatora http://ideone.com/QsZVfH – stefan
Nice! Czy masz pomysł, dlaczego? Kompilator nie mógł po prostu odgadnąć, że ten kod jest podobny do zwykłego wywołania funkcji (no-capture ale samego siebie)? – 3XX0
@fscan Muszę, ponieważ jest to funkcja rekurencyjna lambda. Wnioskowanie o typ nie działa tutaj – 3XX0