Disposition de la mémoire des fermetures Go
Les fermetures Go, comme les fermetures dans de nombreux autres langages de programmation, permettent aux fonctions d'accéder à des variables définies en dehors de leur portée. Bien que le concept de fermeture soit similaire dans toutes les langues, la manière dont elles sont représentées en mémoire peut varier. Dans Go, les fermetures sont de simples allocations de tas.
La fonction m := M.Adder() crée à la fois une fermeture de fonction et une allocation pour la valeur M. La mémoire allouée pour cette fermeture contient des pointeurs vers la fonction et la valeur M. La fonction est allouée sur la pile tandis que la valeur M est allouée sur le tas. La mémoire totale allouée est de 16 octets (pour le pointeur vers la fonction et la valeur M) plus la taille de la valeur M (dans ce cas, 8 octets).
La valeur func() renvoyée par la fermeture l’appel n’alloue aucune mémoire supplémentaire. Il fait simplement référence à l'allocation de fermeture existante, qui contient des pointeurs vers la fonction et la valeur M.
Par conséquent, la mémoire totale allouée lors de l'appel de a := m.Adder() est de 24 octets (16 octets pour la fermeture et 8 octets pour la valeur M). La valeur de la fonction elle-même n'alloue aucune mémoire supplémentaire et fait simplement référence à la fermeture.
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!