taguer - Comment les membres de la structure sont-ils alloués en mémoire?




taguer ou tagger (2)

En essayant de créer un gestionnaire de mémoire pour les futurs programmes C, j'ai rencontré cette question:

"lorsque les structures sont allouées, les champs de leurs membres sont-ils stockés dans l'ordre spécifié?"

Par exemple, considérez la structure suivante.

typedef struct {
    int field1;
    int field2;
    char field3;
} SomeType;

Une fois allouées, les adresses mémoire des champs seront-elles dans l'ordre field1, field2, field3? Ou n'est-ce pas garanti?


  1. Les membres sont localisés un par un;
  2. Le lieu de départ de chaque membre doit être divisé exactement par sa longueur:

Par exemple:

typedef struct {
char field1;
int field2;
double field3;
} SomeType;

Le premier emplacement de la structure est x:

La longueur de field1 est 1 (byte), filed2 est 4, field3 est 8

donc field1 est à x + 0, field2 est à x + 4 ~ x + 7, field3 est à x + 8 ~ x + 15, et x + 1 ~ x + 3 est rembourré pour rendre field2 à la bonne place.

Et toute la longueur de la structure devrait être divisée exactement par son plus grand membre; sinon, rembourrage quelques octets à la fin.


Vous avez la garantie que field3 vient après field2 , qui vient après field1 , et que field1 est au début de la mémoire (ie il n'y a pas de padding avant field1 ). Cependant, ils peuvent être bourrés entre les autres membres (et même après field3 ). En bref, l'ordre dans lequel ils sont déclarés est l'ordre dans lequel ils sont placés en mémoire, bien que l'alignement exact et le remplissage soient définis par l'implémentation (mais il n'y aura pas de remplissage avant le premier membre).





struct