10
votes

Quelle est la taille de cette structure C #?

est-il 12 octets ou 16 octets lorsqu'il est stocké dans une liste code>?

public struct DataPoint
{
    DateTime time_utc;
    float value;
}


3 commentaires

J'espère que vous êtes conscient que chaque instance de cette structure sera en boîte lorsqu'il sera placé dans une liste, alors ajoutez l'espace du pointeur.


@Toxicavenger: pas est en boîte lorsque vous le mettez à l'intérieur d'une liste . Il serait encadré dans une liste ArrayList ou list cependant.


Ceci est plus spécifique, mais éventuellement un duplicata de Stackoverflow.com/Questtions/3361986/...


6 Réponses :


7
votes

2 commentaires

Vous pouvez ajouter la solution à sa question: 16 octets (8 octets + 4 octets + 4 octets alignement)


Marshal.Sizeof () Est-ce que pas retourne la taille d'une structure gérée, seule la version non gérée de celle-ci. Vérifiez la réponse de Steve.



0
votes

Essayez marshal.sizeof (typeof (DataPoint))


0 commentaires

3
votes

Ce sera 12 octets (4 pour flotteur, 8 pour DateTime); Marshal.Sizeof reviendra 16 car l'emballage par défaut est 8 octets aligné. Ce est un bon article sur les structures et l'emballage. Il donne une description complète de ce qui se passe réellement.


0 commentaires

14
votes

Jetez un coup d'œil à la réponse de @hans Passant Ici pour des antécédents intéressants sur cette question, en particulier En ce qui concerne les limitations de maréchal.sizeof .


0 commentaires

8
votes

Le CLR est libre de poser des types de mémoire en mémoire car il voit l'ajustement. Donc, il n'est pas possible de donner directement "la" taille.

Toutefois, pour les structures, il est possible de limiter la liberté du CLR à l'aide du Attribut StructLayout :

  • auto : l'exécution choisit automatiquement une mise en page appropriée.
  • séquentielle : les membres de l'objet sont aménagés séquentiellement et sont alignés en fonction de la valeur StructLayOUTATTRibute.Pack .
  • explicite : la position précise de chaque membre est explicitement contrôlée.

    Le compilateur C # applique automatiquement le type de mise en page SEQUENTENT à n'importe quelle structure. La valeur valeur par défaut sur 4 ou 8 sur des machines X86 ou X64 respectivement. De sorte que la taille de votre structure est de 8 + 4 = 12 (x86 et x64).


    non liée à partir de la manière dont un type est défini en mémoire, il est également possible de reprogrammer un type de fichier en utilisant le Classe de maréchal . Le marshaller applique plusieurs transformations lors du marshalling d'un type. Le résultat n'est donc pas toujours identique à celui de la manière dont le CLR a aménagé le type. (Par exemple, un bool prend 1 octet dans la mémoire plus alignement, tandis que les maréchaux Marshaller A BOOL à 4 octets.)


1 commentaires

REMARQUE Il est possible avec l'instruction IL TAILLEOF pour obtenir la taille du CLR "finale" d'une structure, en tenant compte du remplissage et de toute autre opération d'alignement. Voir Mon article de blog pour savoir comment utiliser et plus de différences (Remarque: j'ai écrit une bibliothèque d'emballages qui peut être appelé de c #)



0
votes

Le code suivant est basé sur Cette question StackoverFlow et réponses : xxx

Je pense que la question que vous vous demandez probablement, n'est pas quelle est la taille du type mais quelle est la distance entre deux éléments contigus de la liste. En effet, l'alignement peut jouer un rôle, comme mentionné par d'autres.

Je pense que la solution à ce problème serait mieux atteinte en utilisant Marshal.unsafeafedDrofPinneDarrayElement () , mais est très difficile à utiliser correctement, en particulier parce que la liste < / code> n'expose pas publiquement la matrice de support.


0 commentaires