2010-03-29 5 views
2

En Java, un byte ou short est stocké dans la longueur de mot «naturelle» de la JVM, c'est-à-dire pour la plupart, 32 bits. Une exception serait un tableau d'octets, où chaque octet occupe un octet de mémoire.Le CLR stocke-t-il de petites valeurs dans des emplacements de taille «naturelle»?

Est-ce que le CLR fait la même chose?

Si le fait, dans quelles situations y at-il des exceptions? Par exemple. Combien de mémoire cela occupe-t-il?

struct MyStruct 
{ 
    short s1; 
    short s2; 
} 

Répondre

3

Bien qu'il soit pas vraiment prévu à cet effet, et peut parfois donner des réponses légèrement différentes (parce qu'il pense à des choses d'un point de vue, et non un point de vue des structures internes CLR Marshalling), Marhsal.SizeOf peut donner une réponse:

System.Runtime.InteropServices.Marshal.SizeOf(typeof(MyStruct)) 

Dans ce cas, il répond à 4. (les courts métrages sont stockés sous forme de short). Veuillez noter qu'il s'agit d'un détail de mise en œuvre, de sorte que la réponse d'aujourd'hui ne doit être utilisée à aucune fin.

+0

Je me demande ce que Marshal.SizeOf (typeof (int)) fait – izb

+0

Notez que la mise en page, en particulier pour le marshalling, peut être modifiée avec 'StructLayout'. – OregonGhost

1

Le CLR empaquette dans une certaine mesure les membres de la même taille. Il empile des tableaux, et je m'attendrais à ce que votre structure d'exemple occupe quatre octets sur n'importe quelle plate-forme.

Exactement quels types sont compressés et comment cela dépend de l'implémentation CLR et de la plate-forme actuelle. Les règles ne sont pas strictement définies, de sorte que le CLR dispose d'une certaine liberté pour réorganiser les membres afin de les stocker de la manière la plus efficace.

2

C'est en fait le travail du compilateur JIT d'assigner la disposition de la mémoire des classes et des structures. La mise en page réelle n'est détectable en aucune façon (au-delà de l'examen du code machine généré), un attribut [StructLayout] est requis pour assembler l'objet à une mise en page connue. Le JAT en profite en réorganisant les champs pour les garder alignés et minimiser la taille de l'allocation.

Il n'y aura pas de surprises dans la structure que vous avez citée, les champs sont déjà alignés sur toute architecture de CPU actuelle qui peut exécuter du code managé. La taille des types de valeur est garantie par la CLI, un short prend toujours 16 bits. Votre structure prendra 32 bits.

+0

+1 pour mentionner 'StructLayout', qui est la chose la plus importante si vous voulez faire l'interop (où vous * avez * besoin de spécifier la disposition exacte). – OregonGhost