Println und Fmt.Println mischen: Stapelwachstum verstehen
In Go wächst der Stapel dynamisch, um die Speicherung von Variablen und Funktionsargumenten zu ermöglichen . Dieses Verhalten kann jedoch beeinträchtigt werden, wenn verschiedene Druckfunktionen verwendet werden.
Betrachten Sie das folgende Beispiel:
package main import "fmt" const size = 1024 func main() { fmt.Println("Start") s := "HELLO" stackCopy(&s, 0, [size]int{}) } func stackCopy(s *string, c int, a [size]int) { println("println: ", s, *s) //fmt.Println("fmt: ", s, *s) c++ if c == 10 { return } stackCopy(s, c, a) }
Wenn nur println verwendet wird, ändert sich die Adresse der Zeichenfolge s, wenn der Stapel wächst :
Start println: 0xc000107f58 HELLO println: 0xc000117f58 HELLO println: 0xc000117f58 HELLO
Wenn jedoch fmt.Println mit println gemischt oder ausschließlich verwendet wird, bleibt die Adresse von s erhalten gleich:
Start println: 0xc00010a040 HELLO fmt: 0xc00010a040 HELLO println: 0xc00010a040 HELLO fmt: 0xc00010a040 HELLO
Den Unterschied verstehen
Der Unterschied ergibt sich aus der Art und Weise, wie println und fmt.Println mit ihren Argumenten umgehen.
println ist ein Integrierte Funktion, die keine an sie übergebenen Argumente behält. Dadurch gelangen die Argumente nicht auf den Heap und werden auf dem Stack alloziert.
fmt.Println hingegen stammt aus der Standardbibliothek und wird wie eine benutzerdefinierte Funktion behandelt. Der Compiler geht nicht davon aus, dass fmt.Println seine Argumente nicht behält, sodass sie möglicherweise auf den Heap gelangen. Folglich werden Argumente für fmt.Println auf dem Heap und nicht auf dem Stapel zugewiesen.
Da die StackCopy-Funktion ein großes Argument ([size]int) akzeptiert, kann der anfängliche Stapel nicht mehr ausreichen und ein größerer sein zugeteilt. Wenn die auf dem Stapel zugewiesenen Variablen als Argumente an Funktionen übergeben werden, wo sie auf den Heap übertragen werden können, werden sie mit zunehmendem Stapelwachstum auf den Heap verschoben. Aus diesem Grund beobachten wir die Änderung der Adresse von s, wenn nur println verwendet wird.
Fazit
Das Mischen von println und fmt.Println kann das Stapelwachstum aufgrund der beeinflussen Unterschiede in der Art und Weise, wie sie mit ihren Argumenten umgehen. println behält Argumente auf dem Stapel, während fmt.Println sie möglicherweise dem Heap zuordnet, was zu Änderungen im Stapellayout und den Variablenadressen führen kann.
Das obige ist der detaillierte Inhalt vonWarum wirkt sich das Mischen von „println' und „fmt.Println' auf das Stapelwachstum in Go aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!