Pourquoi mode_t utilise 4 octets?

Je viens de lire sur mode_t qu’il stocke les informations suivantes:

  • 7 valeurs booléennes du type de fichier (S_IFREG, S_IFDIR, S_IFCHR, S_ISBLK, S_ISFIFO, S_ISLINK, S_ISSOCK)
  • 3 * 3 = 9 valeurs booléennes pour les permissions d’access (lecture, écriture et exécution pour le propriétaire, le groupe et les autres)

Donc, il faut 16 bits = 2 octets. J’imagine que vous pourriez même avoir un peu moins pour le type de fichier, car il doit s’agir d’un fichier normal, d’un répertoire, d’un caractère ou d’un périphérique bloc, d’un socket, d’un lien symbolique ou d’un tube. Ou existe-t-il d’autres types de fichiers?

Donc, je viens de vérifier la taille de mode_t avec

printf("Size: %d byte\n", sizeof(mode_t)); 

Il utilise 4 octets. Pourquoi utilise-t-il 4 octets? Y at-il des informations supplémentaires que je n’ai pas remarquées?

edit: Je viens de trouver que mode_t est défini dans ptypes.inc:

 type mode_t = cuint32; 

cuint32 est un entier non signé de taille 32 bits défini dans ctypes.inc:

 type cuint32 = LongWord; 

Cela aide peut-être pour la réponse.

    Regardons ce que ferait un compilateur “stupide” quand on lui donnerait le code suivant:

     #include  #include  int main(int argc, char **argv) { uint16_t test1 = 0x1122; uint32_t test2 = 0x11223344; if (test1 & 0x0100) printf("yay1.\n"); if (test2 & 0x00010000) printf("yay2.\n"); } 

    Cela semble être un cas d’utilisation probable pour les valeurs de type mode_t , en vérifiant si un indicateur est défini. Maintenant, nous le gcc -O0 avec gcc -O0 et vérifions l’assembly généré:

     0000000000000000 
    : ... f: 66 c7 45 fe 22 11 movw $0x1122,-0x2(%rbp) 15: c7 45 f8 44 33 22 11 movl $0x11223344,-0x8(%rbp) 1c: 0f b7 45 fe movzwl -0x2(%rbp),%eax ; load test1 into %eax 20: 25 00 01 00 00 and $0x100,%eax 25: 85 c0 test %eax,%eax ... 33: 8b 45 f8 mov -0x8(%rbp),%eax ; load test2 into %eax 36: 25 00 00 01 00 and $0x10000,%eax 3b: 85 c0 test %eax,%eax ...

    Vous voyez comment l’instruction spéciale movzwl est nécessaire pour charger la valeur 16 bits? Cela est dû au fait qu’il doit être étendu à deux octets supplémentaires pour pouvoir être inséré dans le registre. Évidemment, cette instruction est plus complexe qu’un simple mov . Cela pourrait avoir un impact minime sur les performances et augmenter la taille de l’exécutable de quelques octets, ce qui en soi ne serait pas trop grave.

    Cependant, si nous considérons qu’il n’y aurait aucun avantage à utiliser une valeur de 16 bits, car elle nécessiterait de toute façon généralement 32 bits de stockage en raison de l’alignement, la raison pour laquelle les concepteurs ont choisi d’utiliser ici la taille de mot native du processeur .