Chaque compilateur C offre la possibilité de "pack" des structures C (par exemple __attribute__ ((__packed__))
, ou #pragma pack()
). Maintenant, nous savons tous que l'emballage est nécessaire, si nous voulons envoyer ou stocker des données de manière fiable. Cela doit également être une exigence depuis les premiers jours du langage C.
Je me demande donc pourquoi les structures compactées ne font pas partie de la spécification du langage C? Ils ne sont même pas en C99 ou C11 même si la nécessité de les avoir est connue depuis des décennies maintenant? Qu'est-ce qui me manque? Pourquoi est-il spécifique au compilateur?
Réponses:
Je suppose que c'est parce que cela dépend de la combinaison du processeur / compilateur cible utilisé. Cela signifie qu'il vaut mieux être une directive du compilateur (car elle est liée à cela) que l'aspect langage, car comment spécifier cela? La seule façon pour eux de le faire, c'est avec l'union.
L'article de Raymond donne un aperçu de la raison de cette situation: http://www.catb.org/esr/structure-packing/
la source
Il y a trois facteurs principaux.
Avec ces facteurs à l'esprit, les compilateurs standard et tous les compilateurs C / C ++ remplissent régulièrement les structures pour assurer un alignement optimal pour le processeur, mais fournissent également des mécanismes pour le remplacer si nécessaire à des fins d'interopérabilité.
Ce n'est en aucun cas quelque chose qui a été négligé. Il est extrêmement bien compris et la situation actuelle est de par sa conception. Les dernières versions de la norme C ++ prennent en charge de manière approfondie la gestion des problèmes d'alignement, que vous ne connaissez peut-être pas.
la source
Il est spécifique au compilateur car il n'est pas dans la norme. Et ce n'est pas dans la norme car il serait difficile de spécifier d'une manière qui ne nécessiterait pas beaucoup d'efforts de mise en œuvre pour les compilateurs de plates-formes obscures avec des restrictions d'alignement appliquées.
Et aucun de ces efforts n'a beaucoup de justification, car tous les compilateurs / plates-formes qui intéressent tous ceux qui utilisent un compilateur C89 ou ultérieur l'ont déjà implémenté.
la source
&
/ les|
opérations nécessaires pour lire / écrire les valeurs de chaque champ.