Imaginez une structure composée de valeurs de membre 32 bits, 16 bits et 8 bits. Lorsque la commande des valeurs de membre est telle que chaque membre est sur sa limite naturelle.
struct Foo { uint32_t a; uint16_t b; uint8_t c; uint8_t d; uint32_t e; };
3 Réponses :
sur des systèmes qui offrent réellement ces types, il est très susceptible de fonctionner. On dit qu'un système 36 bits Ces types ne seraient pas disponibles en premier lieu. P>
GCC fournit un attribut
p>
__ attribut__ ((emballé)) code> p> blockQuote>
avec effet similaire. P>
Ce n'est pas vraiment dépendant de la dépendance, mais plutôt de l'architecture dépendante. Par exemple, certains processeurs 16 ou 32 bits ne peuvent pas adresser directement une adresse 8 bits, il peut donc nécessiter de générer des instructions de décalage et de masque supplémentaires pour extraire une valeur de 8 bits à partir d'une mémoire de 16 ou 32 bits. Cette situation est beaucoup plus commune que votre système hypothétique 36 bits (ARM7 par exemple).
@Clifford: Ce n'est pas courant. Le compilateur doit déjà générer du code permettant d'adresser un type 8 bits s'il existe (car il ne peut jamais être aligné dans des tableaux), ce n'est donc pas une contrainte supplémentaire. En général, "l'alignement" d'un type ne peut jamais être plus grand que sa taille (et doit diviser sa taille), il serait donc pathologique pour un compilateur pour imposer un alignement plus important lorsque le type est utilisé dans une structure.
Je ne disait pas que le compilateur ne pouvait pas ou ne générerait pas de code pour des accès 8 bits si nécessaire, plutôt pour des raisons de performance, il l'éviterait pour une structure. Un tableau est garanti d'être contigu, une structure n'est pas. Je suggérerais que ARM7 soit assez commun, mais comme il est tagué Linux, pas tellement dans ce contexte.
En général, vous êtes correct que ce n'est pas une hypothèse sûre, bien que vous obteniez souvent l'emballage que vous attendez sur de nombreux systèmes. Vous pouvez utiliser l'attribut E.g. P> emballé code> de vos types lorsque vous utilisez GCC.
struct __attribute__((packed)) Blah { /* ... */ };
Ceci est plutôt dangereux et totalement inutile. Voir ma réponse.
Dans la pratique, sur tout système où les types EDIT: strong> Pour élaborer pourquoi il peut être nocif pour utiliser Quant pourquoi il est inutile, gardez à l'esprit que uintxx_t code> existent, vous obtiendrez l'alignement souhaité sans aucun rembourrage. Ne jetez pas dans la vidéographie GCC-ISM pour essayer de le garantir. P>
attribut emballé code> ou
aligné code>, il peut causer la structure entière
attribut code> est spécifique aux compilateurs de GCC et de GCC-Workalike. La norme C ne laissait pas l'alignement non défini ou non spécifié. C'est défini par la mise en œuvre forte>, ce qui signifie que la mise en œuvre est
attribut code> est une fonction GCC, si vous utilisez-le, vous supposez déjà un compilateur de type GCC, mais par hypothèse, vous avez l'alignement que vous souhaitez déjà. P>
Avec C11, vous pouvez également _static_assert code> que la taille de la structure est ce que vous attendez.
Dans C,
FOO code>, dans
Tailleof (FOO) code>, n'est pas déclaré. L'expression est une erreur (sauf si
foo code> est défini / déclaré ailleurs ailleurs). Je vous suggère que vous n'essayez pas d'écrire des fichiers source multilingues: les inconvénients sont beaucoup plus gros que tout pro vous pourriez trouver.
@PMG: pédantisme. :)
Typeft struct foo {...} foo; code>
Je crois que le
Typedef code> est redondant (et donc une source de bugs amovible en toute sécurité) en C ++. Mon point reste: écrire des fichiers sources multilingues est plus de problèmes que cela vaut la peine.