Question

Can un compilateur C ++ (++ spécifiquement g) re-commande, les éléments internes d'un struct?

Je vois un comportement étrange où j'ai une structure qui contient quelque chose comme ce qui suit:

Struct SomeStruct{
   ...
   ...
   long someLong;
   long someLongArray[25];
   unsigned long someUnsignedLong;
   unsigned long someUnsignedLongArray[8];
   unsigned long int someUnsignedLongInt;
   ...
   ...
};

Quand j'écris sortie ce vers un fichier, l'ordre de someUnsignedLongArray et someLongArray semblent être inversée (par exemple les éléments someLongArray [] apparaître après someUnsignedLong et les éléments de someUnsignedLongArray [] apparaissent après someLong ). Est-ce possible ??

Merci


Mise à jour: Comme l'a demandé, je suis en train d'écrire la structure en utilisant les éléments suivants:

int fd = open(fspec,O_RDWR|O_CREAT|O_TRUNC,0666);
int writeRes =  write(fd,(char *)&someStruct,sizeof(SomeStruct));

Pour être complet, voici la struct complète:

struct SomeStruct{
byte someByte;
byte someByteArray[6];
char someChar;
char someCharArray[5];
char someCharArrayArray[3][5];
short someShort;
signed short someShortArray[2];
unsigned short someUnsignedShort;
unsigned short someUnsignedShortArray[8];
int someInt;
int someIntArray[3];
int someIntArrayArrayArrayArray[4][3][2][6];
int *pSomeInt;
unsigned int someUnsignedInt;
unsigned int someUnsignedIntArray[9];
long someLong;
long someLongArray[25];
unsigned long someUnsignedLong;
unsigned long someUnsignedLongArray[8];
unsigned long int someUnsignedLongInt;
long long someLongLong;
long long someLongLongArray[5];
bool someBool;
bool someBoolArray[3];
unsigned long long someUnsignedLongLong;
unsigned long long someUnsignedLongLongArray[5];
unsigned long long someUnsignedLongLongArrayArray[5][2];
unsigned long long int *pSomeUnsignedLongLongInt;
};
Était-ce utile?

La solution

Il ne peut normalement pas modifier l'ordre des éléments, non.

Une exception est s'il y a un spécificateur d'accès qui les sépare:

struct Foo {    
  A a;
  B b;
  C c;
private:
  D d;
  E e;
  F f;
};

a, b et c sont garantis être stockés dans cet ordre, et d, e et f sont garantis être stockés dans l'ordre. Mais il n'y a aucune garantie sur l'endroit où a, b et c sont stockés par rapport à d, e et f.

Une autre chose à garder à l'esprit est que le compilateur peut insérer autant padding comme il aime, même si elle ne réorganise pas quoi que ce soit.

Voici la partie pertinente de la norme:

Section 9.2.12:

  

membres de données non statiques d'un   classe déclarée sans (non syndiqués) un   intervenant accès spécificateur sont   alloués pour que les membres ont plus tard   adresses plus élevées au sein d'une classe   objet. L'ordre d'attribution des   les membres de données non statiques séparés par un   accès spécificateur est non précisé   (11.1) "

Autres conseils

Il ne peut pas, voir champ automatisé re -Commander en C struct pour éviter un rembourrage et Pourquoi pas structs OPTIMIZE GCC? pour plus d'informations.

Je ne sais pas ce que vous entendez par « inversé », peut-être vous devriez ajouter du code et la sortie.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top