[c] : Taille d'une structure != somme de ses élements?

: Taille d'une structure != somme de ses élements? [c] - C - Programmation

Marsh Posté le 30-07-2003 à 18:17:17    

Bonjour !
 
Pour une application aux files de messages, j'ai besoin d'une structure adéquate.
 
J'ai remarqué que pour le code suivant :
 

Code :
  1. struct message
  2. {
  3. long mtype;
  4. char bit;
  5. unsigned long donnee;
  6. };


La taille totale de la structure (via l'opérateur sizeof) était de 12 alors que la somme des parties n'était que de 9. Est-ce une généralité? Une optimisation du compilateur?  
 
Merci !
 
 :hello:

Reply

Marsh Posté le 30-07-2003 à 18:17:17   

Reply

Marsh Posté le 30-07-2003 à 18:19:00    

Alignement 4 octet nan ? (et donc char prend 4 au lieu d un)
 
Enfin ca dependra aussi du system, sous 64 bit solaris ca donne sizeof de 24 (avec alignement de 8)

Reply

Marsh Posté le 30-07-2003 à 18:19:09    

ton compilateur ajoute des octets de bourrage afin de mieux aligner les champs. ça prends un peu plus de place, mais l'acces est plus rapide. ton compilateur doit avoir une option pour inhiber cet effet. certains types ont absolument besoin d'etre aligné (comme les flottants)

Reply

Marsh Posté le 03-08-2003 à 20:20:41    

c'est ce qu'on appelle des octets de "padding"  ;)

Reply

Marsh Posté le 03-08-2003 à 20:24:31    

Kyser a écrit :

c'est ce qu'on appelle des octets de "padding"  ;)  

:heink:

Reply

Marsh Posté le 03-08-2003 à 21:34:24    

ça a plusieurs noms, mais en réorganisant ta structure, tu peux limiter les pertes d'alignement:
 

Code :
  1. struct message
  2. {
  3.   long mtype;
  4.   unsigned long donnee;
  5.   char bit;
  6. };


 
en fait c'est pas le "chat bit" qui génére le bourrage, mais le fait que le "unsigned long donnee" soit -après- le "char bit".

Reply

Marsh Posté le 03-08-2003 à 21:42:59    

c'est une blagounette? y a déjà eu d'autres topics la dessus, et bien plus complet et vous remonter celui-là ...

Reply

Marsh Posté le 03-08-2003 à 23:30:59    

BJOne a écrit :

ça a plusieurs noms, mais en réorganisant ta structure, tu peux limiter les pertes d'alignement:
 

Code :
  1. struct message
  2. {
  3.   long mtype;
  4.   unsigned long donnee;
  5.   char bit;
  6. };


 
en fait c'est pas le "chat bit" qui génére le bourrage, mais le fait que le "unsigned long donnee" soit -après- le "char bit".


J'ai essayé, ca a fait pareil?  :??:

Reply

Marsh Posté le 03-08-2003 à 23:37:16    

bon bin temps pis.... (ça doit dépendre des compilos)

Reply

Marsh Posté le 03-08-2003 à 23:40:32    

ben c'est que ton compilo fait du bourrage dans les deux cas. renseigne toi
 
un exemple avec gcc-3.3

Code :
  1. #include <stdio.h>
  2. struct Foo
  3. {
  4.   int i;
  5.   short f;
  6.   int j;
  7.   char c;
  8. };
  9. struct Bar
  10. {
  11.   int i;
  12.   int j;
  13.   char c;
  14.   short f;
  15. };
  16. struct Baz
  17. {
  18.   int j;
  19.   short f;
  20.   char c;
  21.   int i; 
  22. };
  23. int main()
  24. {
  25.   printf("sizeof(struct Foo) == %u\n"
  26.  "sizeof(struct Bar) == %u\n"
  27.  "sizeof(struct Baz) == %u\n",
  28.  sizeof(struct Foo),
  29.  sizeof(struct Bar),
  30.  sizeof(struct Baz)
  31.  );
  32.   return 0;
  33. }


 
 

[benoit@athlon tmp]$ gcc pad.c
[benoit@athlon tmp]$ ./a.out
sizeof(struct Foo) == 16
sizeof(struct Bar) == 12
sizeof(struct Baz) == 12
[benoit@athlon tmp]$ gcc -fpack-struct pad.c
[benoit@athlon tmp]$ ./a.out
sizeof(struct Foo) == 11
sizeof(struct Bar) == 11
sizeof(struct Baz) == 11


Message édité par Taz le 03-08-2003 à 23:43:05
Reply

Marsh Posté le 03-08-2003 à 23:40:32   

Reply

Marsh Posté le 03-08-2003 à 23:40:50    

Taz a écrit :

c'est une blagounette? y a déjà eu d'autres topics la dessus, et bien plus complet et vous remonter celui-là ...


 
désolé  [:spamafote]

Reply

Marsh Posté le 04-08-2003 à 11:24:43    

Sous Delphi on paut faire des "packed record" pour éviter ce problème... un équivalent existe peut être en C ...

Reply

Marsh Posté le 04-08-2003 à 15:10:40    

=> #pragma pack (spécifique a chaque compilo)
 
Taz> qu'est-ce qui te choque avec padding ?


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 04-08-2003 à 15:19:15    

rien  :??:

Reply

Marsh Posté le 04-08-2003 à 15:23:52    

Citation :

:heink:


Ah bon, autant pour moi alors.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 04-08-2003 à 15:26:02    

nempeche qd on va lire dans un fichier (qui possede une certaine structure) c bien pratique de ne pas aligner la structure en question
 
ou alors on rajoute des variables pour completer
 
 

Code :
  1. struct{
  2. int xxxx
  3. char yyyy[20];
  4. byte dummy;
  5. }


Message édité par red faction le 04-08-2003 à 15:26:17
Reply

Marsh Posté le 04-08-2003 à 15:35:50    

red faction a écrit :


ou alors on rajoute des variables pour completer
 
 


 
je suis le seul à trouver ça très "bricolage dangereux" ? :D


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 04-08-2003 à 15:38:57    

ben 2 ou 3 bytes ca fait de mal a personne
sinon a part lespace pris en memoire je vois pas ce que ca change
 
qd on voit les masses prises par certains progs...
 
iexplore  :whistle:

Reply

Marsh Posté le 04-08-2003 à 15:39:44    

antp a écrit :


 
je suis le seul à trouver ça très "bricolage dangereux" ? :D

Nan [:ddr555]  
En + quelle taille choisir pour le dummy ? Tu peux pas le deviner vu que l'alignement des données peut-être différent suivant les compilos/plateformes.. donc RedFaction : tu sors :D

Reply

Marsh Posté le 04-08-2003 à 15:46:08    

Oui cette histoire de padding c'est un problème lors des accès fichiers. Après, économiser la mémoire, c'est au détriment des perfs ... (comme souvent).


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 04-08-2003 à 15:49:26    

HelloWorld a écrit :

Oui cette histoire de padding c'est un problème lors des accès fichiers. Après, économiser la mémoire, c'est au détriment des perfs ... (comme souvent).
 


 
Y a moyen de s'arranger sans faire tant de bidouille  [:spamafote]


---------------
Le Tyran
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed