Middle+
Où se trouve la variable lorsqu'elle est mise en évidence dans une goroutine?
sobes.tech IA
Réponse de l'IA
Une variable peut être allouée à la fois sur la pile d'une goroutine ou sur le tas. Cela est déterminé par le mécanisme d'escape analysis (analyse d'échappement) du compilateur Go.
Principes de base de l'analyse d'échappement :
- Si le compilateur peut prouver que la variable ne vit que dans un seul appel de fonction ou uniquement dans le cadre de la pile d'une goroutine (c'est-à-dire qu'elle n'est pas référencée depuis l'extérieur), elle est allouée sur la pile de cette goroutine. C'est plus rapide, car la pile est gérée automatiquement et ne nécessite pas de ramasse-miettes.
- Si le compilateur ne peut pas prouver que la variable est limitée à la pile, ou si elle a des références depuis l'extérieur (par exemple, transmise par pointeur à une autre fonction, écrite dans une variable globale, renvoyée depuis une fonction par pointeur), elle est allouée sur le tas. Le tas nécessite une collecte de déchets, ce qui peut ralentir l'exécution.
Exemple d'allocation sur la pile :
// La variable 'x' est allouée sur la pile de la goroutine, car elle est utilisée uniquement à l'intérieur de la fonction.
func exampleStack() int {
x := 10
return x
}
Exemple d'allocation sur le tas :
// La variable 'p' (pointeur vers int) et l'int auquel il pointe peuvent être alloués sur le tas.
// Cela se produit parce que le pointeur est renvoyé depuis la fonction et peut être utilisé depuis l'extérieur.
func exampleHeap() *int {
x := 20 // La valeur 20 peut être allouée sur le tas
return &x // Retourne l'adresse de la variable x
}
L'analyse d'échappement se produit lors de la compilation. Elle peut être vérifiée en utilisant le drapeau -gcflags "-m" :
go build -gcflags "-m" your_package_name
La sortie du compilateur montrera quelles variables "escape to heap".
Ainsi, la localisation de la variable (pile vs tas) n'est pas déterminée par le fait que la variable est allouée dans une goroutine, mais par la façon dont le compilateur Go analyse son cycle de vie et sa portée.