rekursive Lambda-Implementierung in C ++ 11

8

Ich interessierte mich für rekursive Lambda-Implementierung und fand diesen Code für die Fibonacci-Berechnung:

%Vor%

Und ich habe eine Frage: std::function ist eine polymorphe Funktion, also erzeugt lfib / und speichert das Lambda im Heapspeicher, nicht auf dem Stack. Daher kann Optimierungsmöglichkeiten des Programms verlieren. Richtig oder nicht?

    
Khurshid Normuradov 24.07.2013, 12:49
quelle

1 Antwort

5

Die Typ-Lösch-Daten, die den Status von std::function haben, bleiben bestehen, solange die std::function oder ihre Kopien leben, wahrscheinlich über die Heap-Zuweisung.

Das Gleiche gilt nicht für die Schließung, die erfasste Variablen enthält. Das ist Teil des Status des Lambda-Objekts und enthält wahrscheinlich die Adresse einer Datenstruktur auf dem Stapel, die verschwindet, wenn die aktuelle Funktion zurückkehrt und die Variable lfib den Gültigkeitsbereich verlässt.

Denken Sie daran, dass Sie lfib als Referenz erfasst haben. Daher müssen alle Änderungen an lfib für den Rest der Funktion für das Lambda sichtbar sein (einschließlich, aber nicht beschränkt auf die Initialisierung). Der Compiler kann dies nur auf allgemeine Weise verwalten, indem er die Adresse des lokalen lfib speichert. Wenn lfib in Ihrem speziellen Fall nicht erneut zugewiesen wird, ist es möglich, dass der Compiler den Wert unmittelbar nach der Initialisierung statt einer Referenz speichert. Aber es ist nicht garantiert, und nicht einmal besonders wahrscheinlich.

    
Ben Voigt 24.07.2013 12:53
quelle

Tags und Links