Alors, quelques questions, en fait: p>
int code> ( int32 code>) est spécifié pour être (évidemment) 32 bits. Qu'en est-il d'un int? Code> ( nullable code>)? 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à. Li>
- J'aurais répondu à ma propre question en utilisant
Tailleof (int?) code>; Mais comme int? code> 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 code> 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? LI>
ol>
4 Réponses :
Vous pouvez jeter un coup d'œil dans si a deux champs: un ildasme code> ou réflecteur. p>
bool code> et un
t code>, donc probablement 8 octets (en supposant 4 octets d'alignement). P>
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).
AFAIK, vous ne pouvez pas remercier une valeur nullable. Par conséquent, vous obtenez des données incorrectes.
La documentation Microsoft dit: "Les tailles non gérées et gérées d'un objet peuvent différer." - Donc, cette méthode n'est pas fiable.
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. P>
essentiellement, p>
... cela indique que le type nullable Wrapper nécessite 4 octets de stockage ... P> blockQuote>
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. P>
La taille suivante est 3. et Char?, vous obtiendrez maintenant 1 octets de rembourrage. P>
gros saut au prochain, int? nécessite 5 octets mais le rembourrage augmente à 8. p>
cetera. Vous en trouvez ceci en écrivant un peu de code comme celui-ci: p> 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. P> p>
Dupliqué possible de Quelle est l'empreinte mémoire d'une nullable a>