8
votes

Disposition de la mémoire pour la structure imbriquée en C

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;


5 commentaires

Vous pouvez utiliser le offsetof () 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 est un type 64 bits ou un type 32 bits.


var1 est juste un autre membre à l'intérieur de la structure tag1 ., et est comme a dans la même structure. Que var1 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 est juste comme vous avez placé B dans le Premier exemple, avec la différence étant que vous avez long var1.b à 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 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)


3 Réponses :


6
votes

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 pragma qui ajuste la manière dont l'alignement se produit le long des limites de la mémoire.

un exemple 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:
(32 bits d'adressage, sans relevés de pragma) xxx

dans la principale: xxx

mémoire pour structure s < / Code> représenté sur la première ligne d'image:

 Entrez la description de l'image ici

Remarque Il n'y a pas d'utilisation supplémentaire de mémoire requise directement en raison des constructions de struct ou même de sous-structure. Mais indirectement , il peut y avoir (et sera souvent) de mémoire supplémentaire requise pour Rembourrage d'alignement . 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 Effecte le calque Tailleof A struct .

Vous pouvez voir que la taille de chaque instance de votre structure d'origine est 8, (16 pour deux instances) et parce que int et long alignez parfaitement (et ont la même taille) dans cette instance, il semble y avoir Pas de rembourrage. Si long a été remplacé par long long ce ne serait plus le cas. Le rembourrage serait presque certainement requis.

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: xxx

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: xxx

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 pragma appels . Sur ma machine et compiler pour la cartographie de la mémoire 32 bits, voici ce que je vois:

 Entrez la description de l'image ici

Au fait, il y a un Discussion ici couvrant des points connexes dans ce sujet.


0 commentaires

2
votes

comment la structure imbriquée est stockée en mémoire? xxx

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. TAILLEOF L'opérateur retournera la taille des variables en fonction du système spécifique au système.

Par exemple (avec rembourrage) Variables stockées dans la mémoire

dans des machines 32 bits Int & Long Les deux attribuent 4 octets.

| var2.var1.b | ==> 0x601058

| var2.a | ==> 0x601054

dans des machines de 64 bits INT alloue 4-octets et alloue longes 8-octets.

| var2.var1.b | ==> 0x601058

| var2.a | ==> 0x601050

L'alignement de la mémoire des membres de la structure est expliqué ici alignement en C


0 commentaires

0
votes

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)
 -----------------------


0 commentaires