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?
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.