Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2307 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°472351
Caedes
Posté le 30-07-2003 à 18:17:17  profilanswer
 

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:

mood
Publicité
Posté le 30-07-2003 à 18:17:17  profilanswer
 

n°472352
VisualC++
J'va y penser ...
Posté le 30-07-2003 à 18:19:00  profilanswer
 

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)

n°472353
Taz
bisounours-codeur
Posté le 30-07-2003 à 18:19:09  profilanswer
 

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)

n°476432
Kyser
Agent Bebert
Posté le 03-08-2003 à 20:20:41  profilanswer
 

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

n°476434
Taz
bisounours-codeur
Posté le 03-08-2003 à 20:24:31  profilanswer
 

Kyser a écrit :

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

:heink:

n°476472
bjone
Insert booze to continue
Posté le 03-08-2003 à 21:34:24  profilanswer
 

ç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".

n°476477
Taz
bisounours-codeur
Posté le 03-08-2003 à 21:42:59  profilanswer
 

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

n°476592
Caedes
Posté le 03-08-2003 à 23:30:59  profilanswer
 

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?  :??:

n°476595
bjone
Insert booze to continue
Posté le 03-08-2003 à 23:37:16  profilanswer
 

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

n°476597
Taz
bisounours-codeur
Posté le 03-08-2003 à 23:40:32  profilanswer
 

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
mood
Publicité
Posté le 03-08-2003 à 23:40:32  profilanswer
 

n°476598
bjone
Insert booze to continue
Posté le 03-08-2003 à 23:40:50  profilanswer
 

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]

n°476774
Kyle_Katar​n
Posté le 04-08-2003 à 11:24:43  profilanswer
 

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

n°477015
HelloWorld
Salut tout le monde!
Posté le 04-08-2003 à 15:10:40  profilanswer
 

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


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°477032
Taz
bisounours-codeur
Posté le 04-08-2003 à 15:19:15  profilanswer
 

rien  :??:

n°477036
HelloWorld
Salut tout le monde!
Posté le 04-08-2003 à 15:23:52  profilanswer
 

Citation :

:heink:


Ah bon, autant pour moi alors.


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
n°477038
red factio​n
Posté le 04-08-2003 à 15:26:02  profilanswer
 

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
n°477058
antp
Super Administrateur
Champion des excuses bidons
Posté le 04-08-2003 à 15:35:50  profilanswer
 

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
n°477062
red factio​n
Posté le 04-08-2003 à 15:38:57  profilanswer
 

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:

n°477064
*syl*
--&gt; []
Posté le 04-08-2003 à 15:39:44  profilanswer
 

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

n°477073
HelloWorld
Salut tout le monde!
Posté le 04-08-2003 à 15:46:08  profilanswer
 

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
n°477077
LetoII
Le dormeur doit se réveiller
Posté le 04-08-2003 à 15:49:26  profilanswer
 

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
mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
[PHP] question de base sur la structure du if...then...else ?[JSP] Structure d'une webapp simple et déploiement sous Tomcat
[perl] limite en taille des variables perl[SGBD] Structure de tables mysql
[php] Récupérer la taille d'un texte créé avec GD ? (résolu)ouvrir IE avec une taille et position precise
comment donner une taille IE et lui donner une positionListe d'elements...
[structure] Comment représenter des arbres ?[Perl] Effacer éléments du tableau
Plus de sujets relatifs à : [c] : Taille d'une structure != somme de ses élements?


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR