Renvoyer un pointeur sur une pile en Go : dévoilé
En programmation C, renvoyer un pointeur vers une variable allouée par la pile peut entraîner des problèmes , car la mémoire est supprimée après le retour de la fonction. Cependant, dans Go, renvoyer des pointeurs vers des variables créées par la pile est non seulement sûr, mais également une pratique courante.
Grâce à l'analyse d'échappement, Go alloue automatiquement les valeurs qui échappent à la pile (pointeurs qui peuvent être référencés en dehors de la portée actuelle ) au tas. Cela élimine le besoin de se soucier de l'emplacement d'allocation des variables.
Comme indiqué dans la FAQ Go : "Comment savoir si une variable est allouée sur le tas ou sur la pile ?" :
if the compiler cannot prove that the variable is not referenced after the function returns, then the compiler must allocate the variable on the garbage-collected heap to avoid dangling pointer errors
Pour observer les choix d'optimisation du compilateur, utilisez l'option -gcflags -m lors de la compilation. Cela fournira un aperçu de la façon dont Go gère l'allocation de mémoire pour différents scénarios.
Exemple :
Considérez le code Go suivant :
package main import ( "fmt" ) func main() { fmt.Println(*(something())) } func something() *string { s := "a" return &s }
Dans Dans cet exemple, la fonction quelque chose renvoie un pointeur vers une variable allouée par la pile. Cependant, en raison de l'analyse d'échappement de Go, le compilateur reconnaît que le pointeur renvoyé est utilisé en dehors de la portée de la fonction et alloue la variable sur le tas. Cela garantit que les pointeurs restent valides et déréférençables.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!