pb de taille de structure

pb de taille de structure - C++ - Programmation

Marsh Posté le 17-11-2002 à 22:23:31    

Bonjour,  
 
soit
 
typedef struct SERVERHEADER
{
 signed long Version;
 unsigned char ID;
} *PSERVERHEADER;
 
sizeof(SERVERHEADER) = 8
 
sizeof(signed long) = 4 et sizeof(unsigned char) = 1
 
je comprends aps ou sont les 3 octets pour passer de 5 à 8 ???


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 17-11-2002 à 22:23:31   

Reply

Marsh Posté le 17-11-2002 à 22:24:52    

c'est p-e un problème d alignement non ?


Message édité par charlene le 17-11-2002 à 22:25:22
Reply

Marsh Posté le 17-11-2002 à 22:26:28    

C'est du padding. Les compilateurs mettent pratiquement toujours ca pour alligner la taille des structures sur des multiples de 4 octets.
 
Parfois même, si tu fais ca :

Code :
  1. struct toto
  2. {
  3. char a;
  4. int b;
  5. char c;
  6. };


Tu te retrouves avec une structure de 12 octets car il ajoute 3 octets bidon entre le a et le b pour que le b se trouve alligné sur une addresse multiple de 4 lui aussi.


Message édité par Kristoph le 17-11-2002 à 22:26:57
Reply

Marsh Posté le 17-11-2002 à 22:31:14    

exactemement c'est tout a fait normal et ca permet un acces memeoire plus rapide (acces direct, pas besoin, de faire un decalage, cela assure aussi que les variables qui ont une taille inférieure ou egale a celle d'un mot-mémoire seront effectivement stockées sur seul mot mémoire)


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 17-11-2002 à 22:52:43    

et y a-t-il une solution pour avoir qd mm ma struct qui fasse 5 octets ? (la déclarer avec qq chsoe de spécial, qqchose comme ca ?)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 17-11-2002 à 22:55:16    

Désactiver l'alignement des données dans les options du compilateur (le mettre sur 1 octet)
 
ex dans C++Builder:
 
http://ibelgique.ifrance.com/antp/_images/dataalign.png
 
note qu'il vaut mieux le laisser sur double word (4 octets) pour des questions de performances il me semble...


Message édité par antp le 17-11-2002 à 22:58:12

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

Marsh Posté le 17-11-2002 à 22:57:09    

ouille aie aie c ou ca ... personne sait sous vc++6 ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 17-11-2002 à 23:01:33    

c le compilo ou le linker qui fait ca ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 17-11-2002 à 23:01:50    

C'est le compilateur.

Reply

Marsh Posté le 17-11-2002 à 23:07:30    

je trouve pas sous vc++, align c une option du linker pour la taille des section, ca plante des kon le change, mais a part ca je trouve rien :(


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 17-11-2002 à 23:07:30   

Reply

Marsh Posté le 17-11-2002 à 23:19:52    

ayé c bon g trouvé :)
 
pour ceux que ca interresse, sous vc++ il faut mettre '/Zp1' ds les options du compilo


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 18-11-2002 à 22:41:04    

BlackGoddess a écrit a écrit :

ayé c bon g trouvé :)
pour ceux que ca interresse, sous vc++ il faut mettre '/Zp1' ds les options du compilo




 
Fait pas ca malheureux :) Petit optimisation du jour: tu laisses l'alignement par défaut propice aux optimisations, et tu déclares ta structure comme ceci (Specifique à VC++):
 
#pragma pack (push, 1)
 
struct Toto{
[...]
};
 
#pragma pop
 
Tada !

Reply

Marsh Posté le 19-11-2002 à 08:18:06    

ah super !!!! a quoi ca sert les #pragman push, #pragma pop en règle générale ?


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 19-11-2002 à 11:19:12    

BlackGoddess a écrit a écrit :

ah super !!!! a quoi ca sert les #pragman push, #pragma pop en règle générale ?




 
MSDN est ton copain :-)
"#pragma" permet d'utiliser des commandes spécifiques au compilateur. Donc c'est pas portable.
 
"#pragma pack" permet de changer l'alignement par défaut du projet ou du fichier.
 
avec "push" et "pop" du change l'alignement et puis tu remets l'ancien (que tu ne connais pas).

Reply

Marsh Posté le 19-11-2002 à 12:02:51    

ok, super :) merci


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 19-11-2002 à 14:40:32    

BlackGoddess a écrit a écrit :

je trouve pas sous vc++, align c une option du linker pour la taille des section, ca plante des kon le change, mais a part ca je trouve rien :(




 
Dans Visual 6:
 
Project Settings, onglet C++, selectionner "code generation" dans la première combo, tu as un champ "struct member alignment"


---------------
In tartiflette, we trust!
Reply

Marsh Posté le 19-11-2002 à 16:02:37    

ah mais c terrible ya plein de maniere lol :p j enote tout :)


---------------
-( BlackGoddess )-
Reply

Marsh Posté le 19-11-2002 à 16:13:16    

BlackGoddess a écrit a écrit :

ah mais c terrible ya plein de maniere lol :p j enote tout :)




 
En fait c'est toujours la même manière: Le fait de changer des settings via l'interface graphique, revient à changer des champs dans la ligne de commande de compilation...et inversement, si tu changes dans la ligne de commande, tu verras que les valeurs des controls depuis les pages de settings changent aussi.


---------------
In tartiflette, we trust!
Reply

Marsh Posté le 19-11-2002 à 16:25:59    

ah, donc ya 2 manieres alors : les settings du compilo directement ou les #pragma direct ds le code :)


---------------
-( BlackGoddess )-
Reply

Sujets relatifs:

Leave a Replay

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