Je comprends le concept de la structure dans C. Je comprends également comment la structure est stockée en mémoire. Donc, j'ai créé Follwoing Stuff:
struct tag1{ int a; struct tag2{ long b; }var1; }var2;
3 Réponses :
Comme indiqué dans les commentaires, la mise en page exacte d'une structure en mémoire est spécifique à la mise en œuvre. En général, la mise en page est affectée par les types de membres, l'adressage de la mémoire (32 bits ou 64 bits) et les appels un exemple em> strong> de ce que je vois sur mon système lorsque je place deux instances de votre structure originale en tant que membres de sous-structure dans une autre structure (pour le contexte et à Forcer la mission de mémoire contiguë), puis attribuée des valeurs à une instance de cette structure pour fournir une teneur distinctive (non nulle) dans la mise en page de la mémoire: dans la principale: p> mémoire pour Remarque Il n'y a pas d'utilisation supplémentaire de mémoire requise directement em> en raison des constructions de struct ou même de sous-structure. Mais indirectement em>, il peut y avoir (et sera souvent) de mémoire supplémentaire requise pour Rembourrage d'alignement em>. Cela se produit lorsque des types de données contenus dans la définition de la structure sont de différentes tailles et ne s'alignent pas naturellement dans les limites d'adressage. Lorsque cela se produit, le remplissage affectera em> Effecte le calque Vous pouvez voir que la taille de chaque instance de votre structure d'origine est 8, (16 pour deux instances) et parce que Pour fournir un contexte pour les informations ci-dessous, les tailles de données pertinentes sur ma machine (compilées pour 32 bits) sont les suivantes: p> Il y aura plus de preuves de rembourrage plus visibles et les effets du pragma en utilisant une gamme plus large de types. La structure suivante contient 4 types de données: p> Utilisation de cette définition de structure, il est intéressant d'afficher la différence de rembourrage causée par l'utilisation d'appels Au fait, il y a un Discussion ici em> couvrant des points connexes dans ce sujet. P> p> pragma code> qui ajuste la manière dont l'alignement se produit le long des limites de la mémoire.
(32 bits d'adressage, sans relevés de pragma) p> structure s < / Code> représenté sur la première ligne d'image: p>
Tailleof code> A
struct code>. P>
int code> et
long code> alignez parfaitement (et ont la même taille) dans cette instance, il semble y avoir Pas de rembourrage. Si
long code> a été remplacé par
long long code> ce ne serait plus le cas. Le rembourrage serait presque certainement requis. P>
pragma code> appels . Sur ma machine et compiler pour la cartographie de la mémoire 32 bits, voici ce que je vois: p>
Tout d'abord, vous devez vérifier la taille du mot de la machine (c'est-à-dire 32 bits / 64- Bit) & sur quel compilateur GCC est installé. Selon les architectures, l'allocation de mémoire variables variera varier.
Par exemple (avec rembourrage) Variables stockées dans la mémoire P> dans des machines 32 bits Int & Long Les deux attribuent 4 octets. P> | var2.var1.b | ==> 0x601058 P> | var2.a | ==> 0x601054 P> dans des machines de 64 bits INT alloue 4-octets et alloue longes 8-octets. p> | var2.var1.b | ==> 0x601058 p> | var2.a | ==> 0x601050 p> L'alignement de la mémoire des membres de la structure est expliqué ici alignement en C p> p>
Pour déterminer la manière dont la structure imbriquée est stockée en mémoire, vous pouvez exécuter le code ci-dessous:
----------------------- | | | | | | | | | ---> int a (8 bytes are used) ----------------------- | | | | | | | | | ---> struct tag2 / long b (8 bytes are used) -----------------------
Vous pouvez utiliser le
offsetof () code> macro dans un programme de test pour voir comment le compilateur met en place diverses structures. Notez que les détails spécifiques techniquement sont dépendants de la mise en œuvre. Par exemple, vous pouvez voir des différences selon que
long code> est un type 64 bits ou un type 32 bits.
var1 code> est juste un autre membre à l'intérieur de la structure
tag1 code>., et est comme
a code> dans la même structure. Que
var1 code> est une structure n'a pas d'importance. Donc de vous voulez faire un "exemple de mise en page de la mémoire" pour le deuxième exemple avec la structure imbriquée, il suffit de placer la structure imbriquée où
var1 code> est juste comme vous avez placé
B code> dans le Premier exemple, avec la différence étant que vous avez
long var1.b code> à la place.
Il suffit d'appliquer les règles récursives.
Merci Monsieur. La taille de la structure est de 16 octets dans GCC. Expliquez-moi monsieur.
La taille de la structure inclut la taille de chaque membre et i> le rembourrage d'alignement. Et comme implicite dans d'autres commentaires, le rembourrage peut être affecté par la manière dont vous configurez votre compilateur. (avec Macro Pack Pragma)