Question

Les systèmes exigent que certaines primitives soient alignées sur certains points de la mémoire (octets en octets multiples de 4, courts-circuits en octets multiples de 2, etc.). Bien sûr, ils peuvent être optimisés pour économiser le moins d’espace possible.

Ma question est la suivante: pourquoi GCC ne le fait-il pas automatiquement? L'heuristique la plus évidente (variables d'ordre allant de l'exigence de taille la plus grande à la plus petite) manque-t-elle en quelque sorte? Certains codes dépendent-ils de l’ordre physique de leurs structures (est-ce une bonne idée)?

Je demande seulement parce que GCC est super optimisé à bien des égards, mais pas dans celui-ci, et je pense qu'il doit y avoir une explication relativement cool (à laquelle je suis oubliée).

Était-ce utile?

La solution

gcc ne réorganise pas les éléments d'une structure, car cela violerait le standard C. La section 6.7.2.1 de la norme C99 stipule:

  

Dans un objet de structure, les membres non-bit et les unités dans lesquelles les champs - & # 64257;   résident ont des adresses qui augmentent dans l’ordre dans lequel elles sont déclarées.

Autres conseils

Les structures sont fréquemment utilisées comme représentations de l'ordre d'emballage des formats de fichiers binaires et des protocoles réseau. Cela casserait si cela était fait. En outre, différents compilateurs optimiseraient les choses différemment et il serait impossible de relier le code entre eux. Ce n'est tout simplement pas faisable.

GCC est plus intelligent que la plupart d’entre nous dans la production de code machine à partir de notre code source; Cependant, je frissonne s'il était plus intelligent que nous en réorganisant nos structures, car ce sont des données qui, par exemple, peut être écrit dans un fichier. Une structure qui commence par 4 caractères, puis par un entier de 4 octets, serait inutile si elle était lue sur un autre système où GCC a décidé de réorganiser les membres de la structure.

SVN gcc a une optimisation de la réorganisation de la structure (-fipa-struct-reorg), mais nécessite une analyse complète du programme et n’est pas très puissant pour le moment.

Les

compilateurs C n'emballent pas automatiquement les structures précisément parce que des problèmes d'alignement tels que ceux que vous avez mentionnés. Les accès qui ne se trouvent pas sur les mots (32 bits sur la plupart des processeurs) sont très pénalisants pour x86 et provoquent des interruptions fatales pour les architectures RISC.

Ne dites pas que c'est une bonne idée, mais vous pouvez certainement écrire du code reposant sur l'ordre des membres d'une structure. Par exemple, en tant que piratage, les personnes jettent souvent un pointeur sur une structure comme type d'un certain champ à l'intérieur duquel elles veulent accéder, puis utilisent l'arithmétique de pointeur pour y accéder. Pour moi, c'est une idée assez dangereuse, mais je l'ai déjà vue utilisée, notamment en C ++, pour forcer une variable déclarée privée à être accessible au public lorsqu'elle est dans une classe d'une bibliothèque tierce et qu'elle n'est pas encapsulée publiquement. Réorganiser les membres serait totalement gâcher cela.

Vous voudrez peut-être essayer le dernier tronc gcc ou, struct-reorg-branch en développement actif.

https://gcc.gnu.org/wiki/cauldron2015?action=AttachFile&do=view&target=Olga+Golovanevsky_+Memory+Layout+Optimizations+of+Structures+and+Objects.pdf

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