web-dev-qa-db-fra.com

Swift compréhension pile / tas

Je veux comprendre ce qui est stocké dans la pile/tas dans Swift. J'ai une estimation approximative: tout ce que vous imprimez et l'adresse mémoire n'apparaissent pas les valeurs, celles-ci sont stockées dans la pile et ce qui est imprimé en tant que valeurs, celles-ci sont sur le tas, essentiellement en fonction des types de valeur et de référence. Suis-je complètement dans l'erreur? Et éventuellement, pourriez-vous fournir une représentation visuelle de la pile/du tas?

33
Dániel Nagy

comme l'a déclaré juul Les types de référence sont stockés dans le tas et les valeurs dans la pile…

Ici, je veux expliquer pourquoi…

Pile et un tas?

Stack est utilisé pour l'allocation de mémoire statique et Heap pour l'allocation de mémoire dynamique, tous deux stockés dans l'ordinateur RAM.

Les variables allouées sur la pile sont stockées directement dans la mémoire, et l'accès à cette mémoire est très rapide, et son allocation est déterminée lors de la compilation du programme. Lorsqu'une fonction ou une méthode appelle une autre fonction qui à son tour appelle une autre fonction, etc., l'exécution de toutes ces fonctions reste suspendue jusqu'à ce que la toute dernière fonction renvoie sa valeur. La pile est toujours réservée dans un ordre LIFO, le dernier bloc réservé est toujours le prochain bloc à libérer. Cela rend très simple le suivi de la pile. Libérer un bloc de la pile n'est rien de plus que d'ajuster un pointeur.

enter image description here

Les variables allouées sur le tas ont leur mémoire allouée au moment de l'exécution, et l'accès à cette mémoire est un peu plus lent, mais la taille du tas n'est limitée que par la taille de la mémoire virtuelle. Les éléments du tas n'ont aucune dépendance les uns avec les autres et peuvent toujours être consultés au hasard à tout moment. Vous pouvez allouer un bloc à tout moment et le libérer à tout moment. Cela rend plus complexe le suivi des parties du tas allouées ou libres à un moment donné.

Pour Échapper à la fermeture : - Une note importante à garder à l'esprit est que dans les cas où une valeur stockée sur une pile est capturée dans une fermeture, cette valeur sera être copié dans le tas afin qu'il soit toujours disponible au moment où la fermeture est exécutée.

Pour plus de référence: http://net-informations.com/faq/net/stack-heap.htm

51
Jaydeep Vyas

Les classes (types de référence) sont allouées dans le tas, les types de valeur (comme Struct, String, Int, Bool, etc.) vivent dans la pile. Voir ce sujet pour des réponses plus détaillées: Pourquoi choisir Struct Over Class?

16
Juul