Pile vs allocation de tas de structures en Aller, et comment ils se rapportent à la collecte des déchets

Je suis nouveau à l'Aller, et je suis en train de vivre un peu de congitive dissonance entre C-style basée sur la pile de programmation où les variables automatiques en direct sur la pile et de la mémoire allouée vie sur le tas et et Python de style basée sur la pile de programmation où la seule chose qui vit sur la pile sont des références/pointeurs vers des objets sur le tas.

Aussi loin que je peux dire, les deux fonctions suivantes, donner le même résultat:

func myFunction() (*MyStructType, error) {
    var chunk *MyStructType = new(HeaderChunk)

    ...

    return chunk, nil
}


func myFunction() (*MyStructType, error) {
    var chunk MyStructType

    ...

    return &chunk, nil
}

c'est à dire affecter une nouvelle structure et de le retourner.

Si j'avais écrit que, dans C, le premier aurait mis un objet sur le tas et la deuxième serait de le mettre sur la pile. La première serait de retourner un pointeur sur le tas, la seconde à retourner un pointeur sur la pile, ce qui aurait évaporé, le temps que la fonction était de retour, ce qui serait une Mauvaise Chose.

Si j'avais écrit en Python (ou de beaucoup d'autres langues modernes à l'exception de C#) exemple 2 n'aurait pas été possible.

- Je obtenir Aller à déchets collecte à la fois les valeurs, de sorte que les deux formes sont très bien.

Citer:

Noter que, contrairement au C, il est parfaitement OK pour retourner à l'adresse d'un
variable locale; le stockage associé à la variable survit
après le retour de fonction. En fait, prendre l'adresse d'un composite
littéral alloue une nouvelle instance à chaque fois qu'il est évalué, de sorte que nous
pouvez combiner ces deux dernières lignes.

http://golang.org/doc/effective_go.html#functions

Mais il soulève quelques questions.

1 - Dans l'exemple 1, la structure est déclarée sur le tas. Qu'en est l'exemple 2? C'est que déclaré sur la pile de la même façon qu'en C ou faut-il aller sur le tas trop?

2 - Si l'exemple 2 est déclaré sur la pile, comment fait-il pour rester disponibles après la fonction retourne?

3 - Si l'exemple 2 est effectivement déclaré sur le tas, comment est-ce que les structures sont passés par valeur plutôt que par référence? Quel est le point de pointeurs dans ce cas?

InformationsquelleAutor Joe | 2012-06-02