Disposition de la mémoire des fermetures Go
Contrairement aux fermetures dans d'autres langues, les fermetures Go sont des structures simples allouées par tas. Ils permettent aux fonctions de capturer et de conserver l'accès aux variables définies dans les étendues englobantes.
Considérez la fermeture Go suivante :
<code class="go">type M int func (m *M) Adder(amount int) func() { return func() { *m = *m + amount } }</code>
Allocation de mémoire pour les fermetures
Lorsqu'une fermeture est créée, deux allocations de mémoire se produisent :
Dans cet exemple, la fermeture capture les pointeur m et une variable de montant. L'allocation de mémoire pour la fermeture ressemblerait à ceci :
struct { F uintptr b [8]byte } [8]byte
Empreinte mémoire de la fonction renvoyée
La fonction renvoyée est elle-même un wrapper mince qui appelle simplement le pointeur de fonction de la structure de fermeture. Il occupe une quantité négligeable de mémoire, généralement juste la taille d'un pointeur de fonction sur l'architecture sous-jacente.
Considérations supplémentaires en matière de mémoire
Lorsque plusieurs fermetures partagent les mêmes variables capturées , ils n'attribuent le bloc mémoire qu'une seule fois, même si les fermetures sont définies dans des fonctions différentes. Cette optimisation réduit la surcharge de mémoire.
Dans Go, les fermetures favorisent la discipline d'utilisation du tas pour les valeurs à longue durée de vie, garantissant ainsi une bonne gestion de la mémoire et un garbage collection.
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!