Quelle est la taille d'une structure avec des Champs de Bits déterminé/mesuré?
#include <stdio.h>
typedef struct size
{
unsigned int a:1;
unsigned int b:31;
unsigned int c:1;
} mystruct;
int main()
{
mystruct a;
printf("%d", sizeof(a));
return 0;
}
- Avec
int b:31
, la sortie est de 8. - Avec
int b:1
, la sortie est 4. - Avec
int b:32
, la sortie est de 12.
Quelqu'un peut-il expliquer la raison?
- Si vous avez toujours voulu savoir quand une machine 64 bits utilise moins d'espace qu'une machine 32 bits (ou, au moins, pas plus de place qu'une machine 32 bits), alors c'est un exemple.
- Êtes-vous sûr? GCC sur x64 Linux/ELF dit que la taille est de 12 pour l' (1,32,1) cas. Je crois que la seule chose qui influe sur la taille de ces structures est la taille du type sous-jacent, qui dans ce cas est
unsigned int
. - ISO/IEC 9899:2011 §6.7.2.1 de la Structure et de l'union des prescripteurs: L'expression qui spécifie la largeur d'un peu de champ doit être une expression constante entière avec un positif de la valeur qui ne dépasse pas la largeur d'un objet de ce type qui seront précisées étaient le côlon et l'expression omis. Je pense que prend en charge votre contention...mais si nous devions trouver un ILP64 de la machine (au lieu de l'habituel LP64 machines), alors je vous agiter autour d'elle.
Vous devez vous connecter pour publier un commentaire.
Vous ne dites pas si vous savez ce que bitfields sont, mais je vais supposer que vous le faites.
Sur votre mise en œuvre, à l'évidence
unsigned int
est un entier de 32 bits, occupant 4 octets. Cela représente pour les premier et deuxième exemples. 3 bitfields total de 33 bits ne rentre pas dans une seuleunsigned int
, d'où la nécessité pour les 8 octets dans le premier exemple. 3 bitfields soit un total de 3 bits certainement s'inscrire dans uneunsigned int
, d'où seulement 4 octets dans le deuxième exemple.En outre, un champ de bits ne peut pas s'étendre sur plusieurs nombres entiers. Ce qui représente le troisième exemple. Je ne me souviens pas si c'est une exigence de la norme, ou juste un détail de votre mise en œuvre. De toute façon, depuis
b
est de 32 bits, il remplit un ensemble deunsigned int
sur son propre, forçant les deux dea
etc
à occuper leur propreunsigned int
, avant et après celui du milieu. Par conséquent, les 12 octets.C'est de l'ordre qui compte. Le code suivant va donner de Sortie: 8
Unsigned int est un entier de 32 bits, occupant 4 octets. La mémoire est allouée de manière contiguë en mémoire.
Option 1:
De sortie: 8
Option 2:
De sortie: 12
Option 3:
De sortie: 4
Option 4:
De sortie: 8
Alignement
Le compilateur est l'arrondi de la taille de la structure à 32 bits, la taille de chaque objet, il peut essayer de référence à 32 bits, et en même temps, c'est de préserver l'ordre des champs de bits.
Donc si vous avez une version 32 bits de l'élément dans le milieu et 1 bit d'éléments de chaque côté, c'est 3 32 bits de mots pour allouer et donc: 12 octets.
Pour les deux autres cas, c'est juste une question de quelques objets 32 bits de votre champ de bits de la séquence peut être emballé dans, tout en préservant l'ordre des champs.
Selon Steve jessop est de répondre à simplement de remplir sa réponse par l'ajout de certains documents qui peuvent aider.
--ISO/IEC 9899:201x 6.7.2.1