Maison  >  Article  >  développement back-end  >  Comment les fermetures Go sont-elles représentées en mémoire ?

Comment les fermetures Go sont-elles représentées en mémoire ?

Susan Sarandon
Susan Sarandonoriginal
2024-10-28 13:52:31414parcourir

How are Go Closures Represented in Memory?

Disposition de la mémoire des fermetures dans Go

Les fonctions Go, y compris les fermetures, implémentent la portée lexicale, leur permettant de référencer les variables déclarées dans leur portée englobante . Ce comportement soulève la question de savoir comment ces fermetures sont représentées en mémoire.

Dans Go, les fermetures sont essentiellement des variables qui font référence à l'environnement dans lequel elles ont été créées. La mémoire allouée pour une fermeture se compose de :

  • Un pointeur vers le code de la fonction
  • Un ensemble de références aux variables que la fermeture capture dans la portée englobante

La taille de la mémoire allouée pour une fermeture dépend de la plateforme et de l'architecture, mais elle implique généralement :

  • 8 octets pour le pointeur de code (sur les systèmes 64 bits)
  • 8 octets par variable capturée

Par exemple, considérons la fermeture suivante :

type M int

func (m *M) Adder(amount int) func() {
    return func() {
        *m = *m + amount
    }
}

Lorsque le code appelle a := m.Adder(), deux fermetures sont créées :

  1. La première fermeture capture le montant de la portée englobante.
  2. La deuxième fermeture capture a, qui fait référence à m, capturant m indirectement.

Le La disposition de la mémoire de la première fermeture comprendra :

  • 8 octets pour le pointeur de code de fonction
  • 4 octets pour le montant (en supposant que int est de 32 bits)

La mémoire totale allouée sera de 16 octets.

La disposition de la mémoire de la deuxième fermeture sera composée de :

  • 8 octets pour le pointeur de code de fonction
  • 8 octets pour a, qui pointe vers la première fermeture
  • 8 octets pour (*m).Adder(amount)

La mémoire totale allouée sera de 24 octets.

En résumé, les fermetures Go sont implémentées sur le tas et stockent un pointeur vers le code de la fonction ainsi que des références aux variables capturées. La taille de la mémoire allouée dépend du nombre de variables capturées et de l'architecture de la plateforme.

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!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn