Kann dies für den Tail Call optimiert werden? Wenn ja, aus welchem ​​Grund geschieht dies nicht?

8

Ich habe die Assembly-Ausgabe in vielen Optimierungsebenen mit gcc 4.8.1 und clang 3.4.190255 überprüft, keine Optimierung für diese Art von Code.

Gibt es einen besonderen Grund, warum collatz_aux keine Tail-Call-Optimierung erhält?

%Vor%     
pepper_chico 25.09.2013, 14:28
quelle

3 Antworten

12

Der Destruktor für den Parameter vector<unsigned> muss nach der Rückkehr aufgerufen werden.

    
Simple 25.09.2013, 14:32
quelle
2

Nur als Referenz habe ich die rekursive Version optimiert, um eine Tail-Rekursion zu erhalten:

%Vor%     
pepper_chico 25.09.2013 16:29
quelle
1

Sie sollten sich nicht auf Tail-Call verlassen. Ich denke, es ist unwahrscheinlich, dass der Optimierer erkennen wird, dass beide rekursiven Aufrufe für den Tail optimiert werden können.

Hier ist eine nicht-rekursive Version.

%Vor%     
Ben 25.09.2013 14:38
quelle

Tags und Links