41 votes

Les membres de classe / struct sont-ils toujours créés en mémoire dans l'ordre où ils ont été déclarés?

C'est une question qui a été déclenchée par Rob Walker's réponse ici.

Supposons que je déclare un class/struct comme suit:

struct
{ 
    char A;
    int B;
    char C;
    int D;
};

Est-il sûr de supposer que ces membres seront déclarés exactement dans cet ordre dans la mémoire, ou est-ce un compilateur dépendante de la chose? Je demande parce que je l'avais toujours supposé que le compilateur peut faire ce qu'il veut avec eux.

Cela nous amène à ma prochaine question. Si l'exemple ci-dessus les causes de la mémoire de l'alignement des questions, pourquoi le compilateur ne pas simplement le transformer en quelque chose comme ceci implicitement:

struct
{ 
    char A;
    char C;
    int B;
    int D;
};

(Je suis à l'origine de demander à propos de C++, mais je serais intéressé d'entendre la réponse C ainsi)

Rubriques connexes

72voto

aib Points 18608

C99 §6.7.2.1 de l'article 13 stipule:

Au sein d'une structure d'objet, l' non-bits membres et les unités qui peu-champs résident avez des adresses cette augmentation dans l'ordre dans lequel elles sont déclarées.

et il ajoute un peu plus à propos de rembourrage et d'adresses. Le C89 équivalent section §6.5.2.1.

C++ est un peu plus compliqué. En 1998 et 2003, les normes, il est §9.2 article 12 (article 15 en C++11):

Non statiques de données des membres d'une (non syndiqués) classe déclarée sans intervenant accès spécificateur de sont alloués à ce que, plus tard, les membres ont plus les adresses au sein d'une classe objet. La commande de l'allocation de non membres de données, séparés par une l'accès spécificateur est pas spécifié (11.1). La mise en œuvre de l'alignement exigences peut entraîner deux adjacentes les membres de ne pas être affecté immédiatement après l'autre; ainsi pourrait exigences pour l'espace pour la gestion fonctions virtuelles (10.3) et virtuel les classes de base (10.1).

4voto

dmckee Points 50318

Les données membres sont rangés dans l'ordre déclaré. Le compilateur est libre de parsemer de rembourrage pour organiser l'alignement de la mémoire qu'il aime (et vous verrez que de nombreux compilateurs ont une cargaison d'un alignement des options de spécification---utile si le mélange bits compilé par différents programmes.).

Voir aussi http://stackoverflow.com/questions/118068/why-doesnt-gcc-optimize-structs.


Il semble que cette réponse est quelque peu obsolète pour le C++. Vous apprendre quelque chose tous les jours. Merci de l'aib, Nemanja.

3voto

Nemanja Trifunovic Points 17239

Fondamentalement, vous ne pouvez compter sur cela que pour les classes avec une disposition standard . À proprement parler, la mise en page standard est une chose C ++0x, mais elle ne fait que normaliser la pratique existante /

2voto

HUAGHAGUAH Points 665

Mis à part le remplissage pour l'alignement, aucune optimisation de structure n'est autorisée par un compilateur (à ma connaissance) pour C ou C ++. Je ne peux pas parler des classes C ++, car elles peuvent être une autre bête entièrement.

Considérez que votre programme s'interface avec le code système / bibliothèque sous Windows mais que vous souhaitez utiliser GCC. Vous devez vérifier que GCC utilise un algorithme d'optimisation de mise en page identique afin que toutes vos structures soient correctement compressées avant de les envoyer au code compilé par MS.

2voto

Chris Young Points 8525

Je ne peux pas parler pour C ++, mais en C, l'ordre est garanti d'être le même ordre en mémoire que celui déclaré dans la structure.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X