pb de taille de structure - C++ - Programmation
Marsh Posté le 17-11-2002 à 22:24:52
c'est p-e un problème d alignement non ?
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 :
|
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.
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)
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 ?)
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:
note qu'il vaut mieux le laisser sur double word (4 octets) pour des questions de performances il me semble...
Marsh Posté le 17-11-2002 à 22:57:09
ouille aie aie c ou ca ... personne sait sous vc++6 ?
Marsh Posté le 17-11-2002 à 23:01:33
c le compilo ou le linker qui fait ca ?
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
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
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 !
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 ?
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).
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"
Marsh Posté le 19-11-2002 à 16:02:37
ah mais c terrible ya plein de maniere lol j enote tout
Marsh Posté le 19-11-2002 à 16:13:16
BlackGoddess a écrit a écrit : ah mais c terrible ya plein de maniere lol 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.
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
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 )-