Wydaje mi się, że optymalizacja rekurencji ogonowej zarówno w C, jak i C ++ działałaby doskonale, ale podczas debugowania nigdy nie widzę stosu ramek, który wskazuje na tę optymalizację. To trochę dobrze, ponieważ stos mówi mi, jak głęboka jest rekursja. Jednak optymalizacja też byłaby miła.
Czy jakieś kompilatory C ++ wykonują tę optymalizację? Czemu? Dlaczego nie?
Jak mam powiedzieć kompilatorowi, żeby to zrobił?
- W przypadku MSVC:
/O2
lub/Ox
- W przypadku GCC:
-O2
lub-O3
Co powiesz na sprawdzenie, czy kompilator zrobił to w określonym przypadku?
- W przypadku MSVC włącz dane wyjściowe PDB, aby umożliwić śledzenie kodu, a następnie sprawdź kod
- Dla GCC ..?
Nadal brałbym sugestie, jak określić, czy dana funkcja jest zoptymalizowana w ten sposób przez kompilator (chociaż uważam za uspokajające, że Konrad mówi mi, żebym ją założył)
Zawsze można sprawdzić, czy kompilator w ogóle to robi, wykonując nieskończoną rekursję i sprawdzając, czy powoduje to nieskończoną pętlę lub przepełnienie stosu (zrobiłem to z GCC i okazało się, że -O2
jest to wystarczające), ale chcę być w stanie sprawdzić pewną funkcję, o której wiem, że i tak się zakończy. Chciałbym mieć łatwy sposób na sprawdzenie tego :)
Po kilku testach odkryłem, że destruktory rujnują możliwość dokonania tej optymalizacji. Czasami warto zmienić zakres niektórych zmiennych i tymczasowych, aby upewnić się, że wykraczają poza zakres, zanim rozpocznie się instrukcja return.
Jeśli jakikolwiek destruktor musi być uruchomiony po wywołaniu końcowym, nie można przeprowadzić optymalizacji wywołania ogonowego.