Si vous avez Nullable<int>
, est-ce que ceci est dans la pile? Combien d'octets cela prend-il?Les types NULL sont-ils stockés dans la pile?
Répondre
Cela ne devrait pas être le correct répondre à vos deux questions. Mais, pour vous divertir, une instance de Nullable<T>
qui n'est pas un élément d'une collection, n'est pas un champ d'un type de référence, n'est pas un local dans un bloc d'itération ou un local hissé dans un lambda ou un La méthode anonyme est probablement stockée sur la pile.
Mais encore une fois, il ne devrait pas importe. C'est un détail d'implémentation (ce qui signifie que cela pourrait être un moyen pour l'implémentation Microsoft du CLR mais ce n'est pas forcément le cas, et cela pourrait être un autre moyen pour l'implémentation Mono du CLR).
Employé de Microsoft Eric Lippert doesn't like it lorsque vous faites référence aux types de valeurs résidant sur la pile, mais oui, Nullable<>
est un type de valeur.
Ils vivent généralement sur la pile, et ont simplement un membre booléen indiquant si la valeur est nulle ou non. Par conséquent (à l'exception des octets de remplissage dus à alignment), un Nullable<int>
prend 5 octets.
donc, vraiment cela prend 8 octets (avec rembourrage), ai-je tort? Est-ce que nullable int est moins efficace que int32? –
En pratique oui, 8 octets. Sur la pile, ce n'est pas un problème - l'allocation de variables sur la pile ne prend pas de temps, et l'espace ne devrait jamais être un problème (si c'est le cas, vous avez de plus gros problèmes). Même si cela vous préoccupe, vous pouvez toujours créer une classe générique qui encapsule un tableau de T avec une classe BitArray indiquant les valeurs non nulles, ainsi qu'une fonction d'index qui retourne Nullable de T. – Mania
Un Nullable<T>
est un struct (et donc un type de valeur), donc les mêmes règles d'emplacement d'allocation s'appliquent à tout autre struct.
Eric Lippert a récemment posté ceci: The Truth About Value Types
vous avez raison. Pas trop important, juste essayer de comprendre exactement ce qui se passe. Si Nullable prend 2 images de la mémoire et int prend 1 alors je suppose que 1 est plus efficace, ai-je tort? –
Si vous envisagez d'utiliser un Nullable alors je suppose que vous pourriez vous intéresser à la nullité de ce int, de sorte que vous auriez probablement avoir une autre pièce de mémoire prise avec un indicateur différent si vous ne le faites pas utiliser un Nullable <>? –
Giraffe
@wcpro: Vous devez choisir 'Nullable' s'il a la bonne signification pour tout ce que vous essayez de modéliser. –
jason