Es scheint mir, dass es perfekt funktionieren würde, eine Tail-Rekursionsoptimierung sowohl in C als auch in C ++ durchzuführen, aber beim Debuggen sehe ich nie einen Frame-Stack, der diese Optimierung anzeigt. Das ist irgendwie gut, denn der Stapel sagt mir, wie tief die Rekursion ist. Die Optimierung wäre aber auch nett.
Führen C ++ - Compiler diese Optimierung durch? Warum? Warum nicht?
Wie kann ich dem Compiler sagen, dass er es tun soll?
- Für MSVC:
/O2
oder/Ox
- Für GCC:
-O2
oder-O3
Wie wäre es zu überprüfen, ob der Compiler dies in einem bestimmten Fall getan hat?
- Aktivieren Sie für MSVC die PDB-Ausgabe, um den Code verfolgen zu können, und überprüfen Sie dann den Code
- Für GCC ..?
Ich würde immer noch Vorschläge machen, wie ich feststellen kann, ob eine bestimmte Funktion vom Compiler so optimiert wird (obwohl ich es beruhigend finde, dass Konrad mir sagt, ich solle sie annehmen).
Es ist immer möglich zu überprüfen, ob der Compiler dies überhaupt tut, indem er eine Endlosrekursion durchführt und prüft, ob dies zu einer Endlosschleife oder einem Stapelüberlauf führt (ich habe dies mit GCC gemacht und herausgefunden, dass dies -O2
ausreichend ist), aber ich möchte es sein in der Lage, eine bestimmte Funktion zu überprüfen, von der ich weiß, dass sie trotzdem beendet wird. Ich würde gerne eine einfache Möglichkeit haben, dies zu überprüfen :)
Nach einigen Tests stellte ich fest, dass Destruktoren die Möglichkeit dieser Optimierung ruinieren. Manchmal kann es sich lohnen, den Gültigkeitsbereich bestimmter Variablen und Provisorien zu ändern, um sicherzustellen, dass sie außerhalb des Gültigkeitsbereichs liegen, bevor die return-Anweisung beginnt.
Wenn nach dem Tail-Call ein Destruktor ausgeführt werden muss, kann die Tail-Call-Optimierung nicht durchgeführt werden.