Maison  >  Article  >  développement back-end  >  Quelle est la différence entre tas et pile dans Golang

Quelle est la différence entre tas et pile dans Golang

青灯夜游
青灯夜游original
2023-01-10 17:27:242427parcourir

La différence entre le tas et la pile : 1. Le tas est utilisé pour stocker les segments de mémoire qui sont alloués dynamiquement lors de l'exécution du processus, tandis que la pile est utilisée pour stocker les variables locales temporairement créées par le programme. 2. Le cycle de vie de la mémoire du tas ; est plus longue que celle de la mémoire de pile ;3. Par rapport à la mémoire de pile, la mémoire tas ne peut pas être automatiquement libérée par le compilateur et ne peut être libérée que par le ramasse-miettes.

Quelle est la différence entre tas et pile dans Golang

L'environnement d'exploitation de ce tutoriel : système Windows 7, GO version 1.18, ordinateur Dell G3.

Il existe deux concepts très importants dans les langages de programmation, le tas et la pile.

Le tas et la pile sont deux structures de données très importantes qui sont souvent utilisées lors de l'édition de programmes, et le langage Go ne fait pas exception.

Jetons un coup d'œil à ces deux structures de données.

Pile

La pile permet uniquement aux données d'être placées à une extrémité de la liste linéaire, puis les données sont supprimées à cette extrémité, c'est-à-dire que les éléments de la pile sont retirés dans l'ordre du premier entré, dernier sorti, dernier entré, premier sorti.

Le processus de mise en pile d'éléments s'appelle pousser. Pousser sur la pile augmentera le nombre d'éléments sur la pile. Le dernier élément placé dans la pile est en haut de la pile et le premier élément placé dans la pile est en bas de la pile.

Lorsque vous retirez des éléments de la pile, ils ne peuvent être retirés que du haut de la pile. Après avoir retiré des éléments, le nombre de piles deviendra plus petit. L'élément mis en premier est toujours retiré en dernier et l'élément est toujours retiré en dernier. mis en dernier est toujours retiré en premier.

Quelle est la différence entre tas et pile dans Golang

Tas

Dans l'allocation de mémoire, le tas revient à placer divers meubles dans une pièce. La taille des meubles peut être grande ou petite. Lors de l'allocation de mémoire, vous devez trouver un espace suffisamment grand. pour installer les meubles. Disposez à nouveau les meubles.

Après avoir placé et libéré des meubles à plusieurs reprises, l'espace dans la pièce deviendra désordonné. À ce moment-là, si vous placez des meubles dans cet espace, vous constaterez que même s'il y a suffisamment d'espace, chaque espace est réparti dans différentes zones et il y en a. pas de section continue pour placer les meubles. À ce stade, l’allocateur de mémoire doit ajuster et optimiser ces espaces.

Quelle est la différence entre tas et pile dans Golang

Comparé à la mémoire allouée au tas et à la mémoire allouée à la pile, le tas convient à l'allocation de mémoire de tailles imprévisibles.

La différence entre la pile et le tas est la suivante :

  • Heap (heap) : le tas est utilisé pour stocker des segments de mémoire alloués dynamiquement pendant l'exécution du processus. Sa taille n'est pas fixe et peut être agrandie ou réduite de manière dynamique. Lorsqu'un processus appelle des fonctions telles que malloc pour allouer de la mémoire, la mémoire nouvellement allouée est ajoutée dynamiquement au tas (le tas est étendu). Lorsque des fonctions libres et autres sont utilisées pour libérer de la mémoire, la mémoire libérée est supprimée du tas (le tas est réduit)

    Stack (stack) : La pile est également appelée pile et est utilisée pour stocker les variables locales temporairement créées par le programme, qui est notre fonction Variables locales définies entre accolades { }.

  • Le cycle de vie de la mémoire tas est plus long que celui de la mémoire pile. Si la valeur renvoyée par la fonction sera utilisée ailleurs, alors cette valeur sera automatiquement allouée au tas par le compilateur.

  • Par rapport à la mémoire de pile, la mémoire de tas ne peut pas être automatiquement libérée par le compilateur et ne peut être libérée que par le ramasse-miettes.

Allocation du tas et de la pile

Une fois la définition de la variable terminée, elle est généralement allouée sur l'espace du tas et de la pile. L'espace existant dépend de l'existence ou non d'une allocation de mémoire dynamique (nouveau/malloc). .

Par exemple, le cas suivant

Case 1

var p *int    //全局指针变量
func f(){
    var i int
    i = 1
    p = &i    //全局指针变量指向局部变量i
}

Case 2

func f(){
    p := new(int) //局部指针变量,使用new申请的空间
    *p = 1
}

Dans le premier cas, var est utilisé pour définir des variables locales, mais comme i est affecté à la variable de pointeur global p, lorsque la fonction se termine, je ne le ferai pas est libéré, donc la variable locale i est allouée sur le tas (libérée manuellement par le programmeur).

  • Variable locale : variable définie dans une fonction, elle a un cycle de vie dynamique : une nouvelle entité est créée à chaque exécution, et elle survit jusqu'à ce que personne ne l'utilise (par exemple, aucun pointeur externe ne pointe vers elle, la fonction se termine Lorsqu'il n'y a pas de chemin pour accéder à cette variable), l'espace qu'elle occupe sera récupéré à ce moment-là

Dans le deuxième cas, new est utilisé pour demander de l'espace puisque p sera libéré après la sortie de la fonction, p. est appliqué sur la pile (libération automatique)

[Recommandations associées : Tutoriel vidéo Go]

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