Sobes.tech
Middle+

Comment un optional est-il stocké en mémoire en Swift?

sobes.tech IA

Réponse de l'IA

Optionnel en Swift est stocké en mémoire de l'une des deux manières :

  1. Pour les types qui ne respectent pas le protocole _ObjectiveCBridgeable : Représentation d'Optionnel Petit/Grand.

    • Optionnel Petit : Si la taille de la valeur est inférieure ou égale à la taille d'un pointeur, l'Optional ajoute un octet à la taille du type pour stocker un drapeau (Présent/Absent).
    • Optionnel Grand : Si la taille de la valeur est supérieure à la taille d'un pointeur, l'Optional utilise deux "emplacements" en mémoire : un pour la valeur elle-même (si présente) et un pour le drapeau de présence. Cela peut être deux segments mémoire contigus ou, dans des cas plus complexes, une référence à une valeur allouée sur le tas.
  2. Pour les types qui respectent le protocole _ObjectiveCBridgeable (par exemple, classes, certaines structures) : Représentation de Pointeur Nullable.

    • Si le type est une classe ou peut être représenté comme un pointeur Objective-C, l'Optional utilise le fait qu'un pointeur peut être nil. Dans ce cas, nil dans l'Optional est représenté comme un pointeur nul, et l'Optional non-nil comme un pointeur vers un objet. C'est plus efficace en mémoire, car cela ne nécessite pas de drapeau supplémentaire.

En résumé, l'Optional peut occuper un peu plus d'espace que le type de base (Optionnel Petit/Grand), ou le même que le pointeur (Pointeur Nullable). La représentation spécifique est déterminée par le compilateur en fonction du type et de sa capacité à être représenté comme un pointeur nullable.

// Exemple : Int n'est pas _ObjectiveCBridgeable, utilise Petit/Grand Optionnel
var maybeInt: Int? = 10 // Peut être Petit Optionnel

// Exemple : String _ObjectiveCBridgeable, peut utiliser Pointeur Nullable
var maybeString: String? = "Hello" // Peut être Pointeur Nullable

// Exemple : Protocole (Any) non _ObjectiveCBridgeable, utilise Petit/Grand Optionnel
var maybeAny: Any? = 5 // Petit/Grand Optionnel