Les langages de programmation allouent des objets en mémoire, et différents les langues utilisent différentes stratégies pour ce faire. En C, les variables allouées à la pile résident sur la pile, tandis que la mémoire allouée au tas est allouée dynamiquement. Python, quant à lui, alloue tous les objets sur le tas, en utilisant des références pour y accéder.
L'approche de Go en matière d'allocation de mémoire diffère de celle de C et de Python. Bien que Go ne spécifie pas explicitement où les objets sont alloués, il utilise le garbage collection pour récupérer la mémoire inutilisée. Cela soulève des questions sur la façon dont les structures, qui sont des types composites, sont allouées dans Go.
Considérez les deux fonctions suivantes, qui semblent effectuer la même tâche :
func myFunction() (*MyStructType, error) { var chunk *MyStructType = new(HeaderChunk) ... return chunk, nil } func myFunction() (*MyStructType, error) { var chunk MyStructType ... return &chunk, nil }
Ces exemples de fonctions soulèvent plusieurs questions :
Dans Go, la pile est utilisée pour stocker les arguments de fonction, les variables locales et valeurs de retour. Le tas est utilisé pour allouer des objets qui ont été créés à l'aide de new ou qui ont échappé à la pile.
Dans la première fonction, un morceau est alloué sur le tas à l'aide de new. Dans la deuxième fonction, l'analyse d'échappement de Go détermine que &chunk échappe à la pile, il est donc également alloué sur le tas.
Même si le morceau est alloué sur la pile dans le deuxième fonction, le garbage collector de Go garantit qu'il reste accessible après le retour de la fonction. En effet, l'analyse d'échappement détermine que le morceau échappe à la portée de la fonction et le garbage collector ne le récupérera pas tant qu'il est référencé par un autre objet.
Les structures sont transmises par valeur dans Go car ce sont des types composites. Passer un pointeur à la place permettrait à l'appelé de modifier la structure d'origine. Dans le cas de la deuxième fonction, chunk est alloué sur le tas, il n'est donc pas nécessaire de lui passer un pointeur. Cependant, les pointeurs sont utilisés lorsque l'appelant doit accéder à une structure qui a été allouée sur le tas.
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!