Maison  >  Article  >  développement back-end  >  Quelle quantité de mémoire les fermetures Go consomment-elles réellement ?

Quelle quantité de mémoire les fermetures Go consomment-elles réellement ?

DDD
DDDoriginal
2024-10-31 21:25:29452parcourir

How Much Memory Do Go Closures Actually Consume?

Disposition en mémoire des fermetures Go

Contrairement à JavaScript, qui exploite une implémentation de fermeture différente, les fermetures Go sont stockées sur le tas en raison à une longévité variable.

Allocation de mémoire pour les fermetures

Considérez la fonction suivante qui génère une fermeture :

<code class="go">type M int

func (m *M) Adder(amount int) func() {
    return func() {
        *m = *m + amount
    }
}</code>

Lors de l'appel d'un := m .Adder(), deux allocations de tas se produisent :

  • 16 octets : Stocke le pointeur de fonction et le pointeur vers la variable capturée (m).
  • Taille de la variable : Dépend du type et de la taille de la variable capturée. Dans ce cas, il s'agit d'un int, donc cela prend 4 octets.

Empreinte mémoire de la valeur func() renvoyée

La valeur func() renvoyée consomme :

  • 8 octets sur les plateformes 32 bits, 16 octets sur les plateformes 64 bits : Stocke le pointeur de fonction.

Par conséquent, le total L'empreinte mémoire de la fermeture dans cet exemple est 20 octets sur les plates-formes 32 bits, 32 octets sur les plates-formes 64 bits.

Exemple :

<code class="go">func closure() func() *byte {
    var b [4 * 1024]byte
    return func() *byte {
        return &amp;b[0]
    }
}</code>

L'appel de Closure() alloue :

  • 16 octets : Métadonnées de fermeture (pointeur de fonction, pointeur de variable capturée)
  • 4096 octets : Le tableau d'octets capturé par la fermeture

Résultant en une allocation de mémoire totale de 4112 octets.

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