11
votes

Quelle est la taille d'une nullable ?

Alors, quelques questions, en fait:

  1. Un int ( int32 ) est spécifié pour être (évidemment) 32 bits. Qu'en est-il d'un int? ( nullable )? Mon intestin me dit que ce serait 32 bits pour l'entier plus 8 bits de plus pour le booléen, mais la mise en œuvre est peut-être plus complexe que celle-là.
  2. J'aurais répondu à ma propre question en utilisant Tailleof (int?) ; Mais comme int? est un type géré ceci n'est pas autorisé. Je comprends que la taille d'un type peut être dépendante de la plate-forme et que, dans le cas d'objets contenant des références à d'autres objets, un taille de l'opération serait trompeur. Cependant, existe-t-il un moyen d'obtenir une taille "de base" (c'est-à-dire quelle taille d'une instance nouvellement instanciée serait) pour un type géré, compte tenu de l'environnement actuel?

1 commentaires

4 Réponses :


6
votes

Vous pouvez jeter un coup d'œil dans ildasme ou réflecteur.

si a deux champs: un bool et un t , donc probablement 8 octets (en supposant 4 octets d'alignement).


1 commentaires

Nice, appris quelque chose de nouveau avec celui-ci! Il est totalement logique, mais je n'avais pas examiné les problèmes d'alignement (je suppose que c'est ce qui se passe lorsque vous entrez le développement logiciel tard dans le jeu, sans éducation CS).




2
votes

J'ai trouvé un traitement sur exactement cette question ici , qui inclut le code d'une application de console simple à Testez l'utilisation de la mémoire.

essentiellement,

... cela indique que le type nullable Wrapper nécessite 4 octets de stockage ...


0 commentaires

7
votes

Il est plutôt important de ne jamais poser une question comme celle-ci, car vous n'obtiendrez pas une réponse directe.

Mais depuis que vous avez fait de toute façon: la taille minimale est de 0 octets. Ce que vous obtiendrez lorsque le JIT Optimizer parvient à conserver la valeur dans un registre de la CPU. La taille suivante est de 2 octets, pour Bool? et octet?, 1 octet pour Hasvalue, un autre octet pour la valeur. Que vous obtiendrez rarement parce que les variables locales doivent être alignées sur une adresse qui est un multiple de 4. Les 2 octets supplémentaires de remplissage ne seront tout simplement jamais utilisés.

La taille suivante est 3. et Char?, vous obtiendrez maintenant 1 octets de rembourrage.

gros saut au prochain, int? nécessite 5 octets mais le rembourrage augmente à 8.

cetera. Vous en trouvez ceci en écrivant un peu de code comme celui-ci: xxx

et en regardant les instructions du code de la machine avec le débogueur. Notez que les compensations du registre EBP. Et méfiez-vous que la pile grandit.


0 commentaires