Vous ne pouvez pas l'approche déterministe de la disposition d'une structure ou d'une union en langage C sur des systèmes différents.
Alors que de nombreuses fois, il pourrait sembler que la mise en page généré par les différents compilateurs est le même, vous devez prendre en compte le cas d'une convergence dictées par la pratique et fonctionnel de la commodité de la conception du compilateur dans le cadre du choix de liberté laissée au programmeur par la norme, et donc pas efficace.
Le C11 norme ISO/IEC 9899:2011, pratiquement inchangé depuis les normes précédentes, clairement indiqué dans le paragraphe 6.7.2.1 de la Structure et de l'union des prescripteurs:
Chaque non-bits membre d'une structure ou d'une union de l'objet est aligné dans une mise en œuvre définies de manière adaptée à son type.
Pire encore, le cas de bitfields où une grande autonomie est laissée au programmeur:
Une mise en œuvre peut attribuer tous adressable de l'unité de stockage assez grand pour contenir un champ de bits.
Si il reste suffisamment d'espace, un peu de champ qui suit immédiatement un autre bit-champ dans une structure doivent être emballées dans les bits de la même unité. Si l'espace est insuffisant reste, si un peu de champ qui ne correspond pas à y mettre de l'unité ou des chevauchements unités adjacentes est mise en œuvre définies. La commande de l'allocation de bit-domaines au sein d'une unité (d'ordre élevé à faible ou faible afin d'ordre élevé) est mise en œuvre définies. L'alignement de la adressable de l'unité de stockage est indéterminé.
Juste compter combien de fois les conditions de mise en œuvre définies par l'' et 'non spécifié' apparaissent dans le texte.
Convenu que pour vérifier la version de compilateur, de la machine et de l'architecture cible de chaque course avant d'utiliser la structure ou de l'union généré sur un système différent est hors de prix , vous devriez avoir reçu un décent réponse à votre question.
Maintenant, disons que oui, il est un moyen de autour de.
Être clair que ce n'est certainement pas la solution, mais c'est une approche commune que vous pouvez trouver autour lorsque les structures de données exchange est partagée entre les différents systèmes: pack d'éléments de structure sur la valeur 1 (standard char de taille).
L'utilisation de l'emballage et de l'exacte définition de la structure peut conduire à un niveau suffisamment fiable déclaration qui peut être utilisé sur différents systèmes. L'emballage force le compilateur à supprimer la mise en œuvre définies alignements, de réduire les éventuelles incompatibilités en raison de la norme. En outre, en évitant d'utiliser bitfields vous pouvez enlever les résidus de mise en œuvre dépend des incohérences. Dernière, l'efficacité d'accès, en raison du manque d'alignement peut être recréé en ajoutant manuellement certains mannequin de déclaration entre les deux éléments, conçu de telle manière à force de chaque champ dans l'alignement correct.
Comme résidu des cas, vous devez tenir compte d'un rembourrage à la structure de la fin que certains compilateurs ajouter, mais parce qu'il n'est pas utile de données associées, vous pouvez l'ignorer (sauf pour la dynamique de répartition de l'espace, mais encore une fois, vous pouvez traiter avec elle).