Maison > développement back-end > Golang > le corps du texte

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

Susan Sarandon
Libérer: 2024-10-28 13:52:31
original
414 Les gens l'ont consulté

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
    }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!