est-il 12 octets ou 16 octets lorsqu'il est stocké dans une liste
public struct DataPoint
{
DateTime time_utc;
float value;
}
6 Réponses :
marshal.sizef () code> p>
Vous pouvez ajouter la solution à sa question: 16 octets (8 octets + 4 octets + 4 octets alignement)
Marshal.Sizeof () Est-ce que pas i> 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.
Essayez marshal.sizeof (typeof (DataPoint)) P>
Ce sera 12 octets (4 pour flotteur, 8 pour DateTime);
Marshal.Sizeof CODE> 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. P>
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 code>. p>
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. P>
Toutefois, pour les structures, il est possible de limiter la liberté du CLR à l'aide du Attribut StructLayout : P>
Le compilateur C # applique automatiquement le type de mise en page STRAND> SEQUENTENT FORT> à n'importe quelle structure. La valeur em> 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). P>
bool code> prend 1 octet dans la mémoire plus alignement, tandis que les maréchaux Marshaller A
BOOL code> à 4 octets.) P>
REMARQUE Il est possible avec l'instruction IL TAILLEOF CODE> 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 #)
Le code suivant est basé sur Cette question StackoverFlow et réponses : 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. P> Je pense que la solution à ce problème serait mieux atteinte en utilisant Marshal.unsafeafedDrofPinneDarrayElement () code>
, mais est très difficile à utiliser correctement, en particulier parce que la liste < / code> n'expose pas publiquement la matrice de support. p> p>
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 i> est en boîte lorsque vous le mettez à l'intérieur d'une liste code>. Il serait encadré dans une liste
ArrayList code> ou
list code> cependant.
Ceci est plus spécifique, mais éventuellement un duplicata de Stackoverflow.com/Questtions/3361986/...