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 :
-
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.
-
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,nildans l'Optional est représenté comme un pointeur nul, et l'Optional non-nilcomme un pointeur vers un objet. C'est plus efficace en mémoire, car cela ne nécessite pas de drapeau supplémentaire.
- 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
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