Gestion de la mémoire des pointeurs renvoyés: une pratique sûre dans Go
en C, le renvoi d'un pointeur vers une variable allocée par empil peut conduire à un comportement non défini en raison de la suppression de la mémoire lors de la retour de la fonction. Cela soulève la question de savoir si un comportement similaire se produit dans GO et s'il est sûr de renvoyer de tels pointeurs.
En Go, le comportement est étonnamment différent. Le compilateur ne génère aucune erreur pour renvoyer des pointeurs alloués comme l'exemple suivant:
package main import ( "fmt" ) func main() { fmt.Println(*(something())) } func something() *string { s := "a" return &s }
Contrairement à C, ce code dans Go est parfaitement valide et ne produira aucune erreur d'exécution. En effet, Go utilise une technique sophistiquée connue sous le nom d'analyse d'évasion.
L'analyse Escape est une optimisation du compilateur qui détermine si une valeur ou un pointeur échappe à sa portée de fonction. Si la valeur ou le pointeur se révèle s'échapper, le compilateur le place sur le tas collecté à ordures plutôt que sur la pile. Dans ce cas, le pointeur retourné * s échappe à la portée de la fonction quelque chose () et est donc placé sur le tas.
La FAQ Go explique succinctement la règle concernant l'allocation de la mémoire: si le compilateur ne peut pas prouver qu'une variable n'est plus référencée après le retour de la fonction. Cette stratégie élimine le besoin de gestion manuelle de la mémoire et garantit que les données pointues restent accessibles après le retour de la fonction.
pour observer les optimisations d'analyse d'échappement du compilateur pendant la compilation, utilisez l'option -gcflags -m. Cette option fournira un aperçu des décisions prises concernant l'allocation de tas et de pile.
Clause de non-responsabilité: Toutes les ressources fournies proviennent en partie d'Internet. En cas de violation de vos droits d'auteur ou d'autres droits et intérêts, veuillez expliquer les raisons détaillées et fournir une preuve du droit d'auteur ou des droits et intérêts, puis l'envoyer à l'adresse e-mail : [email protected]. Nous nous en occuperons pour vous dans les plus brefs délais.
Copyright© 2022 湘ICP备2022001581号-3