Sobes.tech
Junior

Où sont stockés les types de données dans Swift?

sobes.tech IA

Réponse de l'IA

Les types de données en Swift sont stockés dans deux zones principales de mémoire : la pile et le tas.

La pile

  • Types de valeur (types de valeur) :
    • struct (structures)
    • enum (énumérations)
    • Types de base, comme Int, Double, Bool, String (les chaînes courtes peuvent être stockées directement dans la pile pour optimisation)
  • Les données sont stockées directement dans la pile dans l'ordre d'exécution des fonctions.
  • L'allocation et la libération de mémoire se font automatiquement et très rapidement (LIFO - Last In, First Out).

Le tas

  • Types de référence (types de référence) :
    • class (classes)
    • Fonctions et closures
    • Objets (AnyObject)
  • Les objets eux-mêmes sont stockés dans le tas, et la pile ne contient que des références à eux.
  • L'allocation et la libération de mémoire dans le tas se font de manière dynamique et sont gérées par le système (Automatic Reference Counting - ARC).
  • L'accès aux données dans le tas est indirect, via un pointeur.

Caractéristiques

  • Lors de l'assignation d'un type de valeur, toute la valeur est copiée.
  • Lors de l'assignation d'un type de référence, seule la référence est copiée, et les deux objets pointent vers la même zone de mémoire dans le tas.
  • ARC suit le nombre de références fortes aux objets dans le tas et libère automatiquement la mémoire lorsque le nombre de références tombe à zéro.
// Exemple de type de valeur - stocké dans la pile
struct Point {
    var x: Int
    var y: Int
}

var p1 = Point(x: 10, y: 20)
var p2 = p1 // Toute la valeur est copiée

p2.x = 30 // p1 ne change pas
print("p1: \(p1), p2: \(p2)") // Résultat : p1: Point(x: 10, y: 20), p2: Point(x: 30, y: 20)

// Exemple de type de référence - stocké dans le tas
class Circle {
    var radius: Double

    init(radius: Double) {
        self.radius = radius
    }
}

var c1 = Circle(radius: 5.0)
var c2 = c1 // Seule la référence est copiée

c2.radius = 10.0 // c1 change aussi, car ils pointent tous deux vers le même objet dans le tas
print("c1.radius: \(c1.radius), c2.radius: \(c2.radius)") // Résultat : c1.radius: 10.0, c2.radius: 10.0