2009-05-14 7 views
3

Je me demandais s'il y avait un moyen de trouver la taille d'un type de référence en C#. J'ai fait du googling et l'idée générale sur les forums semble être que ce n'est pas possible. Je pensais que je vous demanderais de voir si quelqu'un ici savait mieux.C# Comment trouver la taille d'un type de référence

Après tout, les outils de profilage doivent avoir une façon de le faire? Je sais qu'il n'est pas habituel d'avoir besoin de connaître cette information, mais il serait utile de l'avoir dans certaines situations.

+2

Je crois qu'il s'agit d'un doublon efficace de http://stackoverflow.com/questions/207592/getting-the-size-of-a-field-in-bytes-with-c#207605 –

+0

Oui, je suis d'accord, bien que J'ai cherché SO pour cette question et je n'ai trouvé aucun résultat (j'ai été surpris que cela n'ait pas déjà été demandé). Je dirais que la question est mal intitulée, elle devrait probablement être optimisée pour faciliter la recherche. –

Répondre

1

Vérifiez this detailed answer par Jon, vous trouverez des informations utiles.

+0

Merci - J'essayais de trouver cette question! –

+0

En fait, c'est (généralement) complet et le paragraphe supérieur fait effectivement de cette question un sous-ensemble. Voter pour fermer en fonction de cela. – annakata

0

Une estimation approximative peut être faite, et le suivi de la mémoire utilisée via profilig devrait également être possible. Mais le JIT a la liberté de configurer la mise en page du type qui convient le mieux, qui peut aussi dépendre de la version du framework, de la configuration de la machine (en particulier 32bit vs. 64bit), du framework provider (MS, Mono, GNU.NET etc.) etc.

il calcul à l'avance sera semblable à ceci:

  • les références sont 32bit ou 64bit selon la plate-forme

  • une instance de classe a une référence interne aux informations de type (qui comprend VTable etc.), plus une référence pour chaque type de référence contenu (y compris les chaînes ou les tableaux), plus la mémoire Utilisé par toutes les structures (celles-ci peuvent être mises en page pour que l'accès soit efficace, en laissant en fait de la mémoire inutilisée).

La question est aussi, voulez-vous obtenir la mémoire utilisée par la classe ou par la classe et les données associées (comme les chaînes, les tableaux, listes, etc. dictionatries dans les champs)?

0

Hmmm. J'utiliser un outil de profilage, mais je suppose que quelque chose comme cela pourrait fonctionner:

long before = System.GC.GetTotalMemory(true); 
Foo instance = new Foo(); 
long after = System.GC.GetTotalMemory(true); 
long consumed = after - before; 
+1

Quelle est la raison du vote négatif? – user1068352

+0

Cela ne mesure que la taille d'un nouvel objet vide et ne reflète pas la consommation réelle de la mémoire d'un objet existant. Il peut également y avoir un problème de précision dans les solutions multi-thread. – Alex

Questions connexes