2016-06-19 7 views
1

Ich bin immer neugierig, was mit dem Rückgabewert von einer Funktion passiert, wenn ich einfach die Funktion aufrufen, ohne sie in Variablen zu übergeben. Wo ist es zurück? Wer hält es? Wie lange wird es halten?Funktion hat eine Rückkehr, wohin es zurückgeht? Wer hält es? Wie lange lebt es?

Das folgende Beispiel von Swift geschrieben

func returnFun(input: String) -> String { 
    return(input) 
} 

returnFun("Who Am I?") 

returnFun ist der Name der Funktion und es gibt alle Strings, die Sie in das Argument selbst als Zeichenfolge setzen. die Zeichenfolge Wer bin ich? wurde in das Argument gebracht, wohin geht es? Wer fängt es? Oder es wird gleich nach der Rückkehr zerstört werden?

Vielen Dank für Ihre Zeit und

+0

sind Sie mit [Aufrufliste] (https://en.wikipedia.org/wiki/Call_stack) vertraut? –

+0

@Will Ness Nein, ich kenne Call Stack überhaupt nicht. Danke für die Bereitstellung einer Studienrichtung – SLN

Antwort

4

helfen Wenn Sie nicht speichern (oder anderweitig verwenden) eine Funktion Rückgabewert, wird es einfach weggeworfen werden.

Der Prozess ist, dass die Funktion ihren Rückgabewert an den Aufrufer liefert (normalerweise über die CPU-Register oder den Stack), und es liegt an dem Aufrufer, sie von dort abzuholen.


Die Dinge ein wenig interessanter, wenn Werte größer sind als ein „Maschinenwort“ (etwas, das in einem einzigen Register paßt), wie structs oder Strings (wie in Ihrem Beispiel). Diese müssen möglicherweise als Zeiger auf andere Speicherorte weitergegeben werden, und dieser Speicher muss irgendwie verwaltet (zugewiesen und freigegeben) werden.

Der konzeptionelle Hauptunterschied besteht hier zwischen "Werttypen" und "Referenztypen". Eine Swift-Zeichenfolge ist ein Werttyp, was bedeutet, dass sie kopiert wird (zumindest konzeptionell kann die Implementierung anders sein, um effizienter zu sein, solange sie dasselbe beobachtbare Verhalten zur Folge hat). So können Sie sich beim Aufruf der Funktion einmal die Zeichenfolge vorstellen, die vom Aufrufer in eine lokale Variable input für die Funktion kopiert und bei Rückgabe wieder kopiert (und nicht sofort verworfen) wird.

+0

Wenn der Anrufer beschließt, es nicht aufzunehmen, wird es immer noch da sein, bis das "Leerzeichen" durch andere Rückgaben besetzt oder einfach zerstört – SLN

+1

Der Rückgabewert wird berechnet und gespeichert "für die Abholung" auch wenn Es wird nie benutzt (es sei denn, der Compiler macht einige wirklich clevere Tricks). Aber dieser Raum wird fast sofort für andere Dinge wiederverwendet. – Thilo

+1

Auch hier wird es mit "Referenztypen" etwas komplizierter. Dort wird nur die Referenz in Funktionen hinein- und herausgeführt, viele Referenzen können auf dieselbe Sache zeigen, und die Speicherverwaltung wird kompliziert (Swift verwendet Referenzzählung, andere Umgebungen haben Garbage Collection). – Thilo

Verwandte Themen