Codage du float et structure
Résolu
jehutyy
Messages postés
51
Date d'inscription
Statut
Membre
Dernière intervention
-
nicocorico Messages postés 799 Date d'inscription Statut Membre Dernière intervention -
nicocorico Messages postés 799 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Voila mon soucis, je suis en pleine révision et j'ai un petit problème
On me demande de donner la taille en octet de structure.
typedef struct matiere{
char nom;
float coef;
}matiere;
voila la structure dont je dois calculer la taille, selon moi un char est codé sur 1 octet et un float sur 4 octets donc apriori la taille de la structure serai de 5 octets.
Or en faisant printf("%d", sizeof(matiere)), le résultat est 8.
Je ne comprend pas le résultat et donc ai du mal a l'interpréter.
En espérant m'être fait comprendre, j'espère que vous pourrez m'aider.
cordialement
jehutyy
Voila mon soucis, je suis en pleine révision et j'ai un petit problème
On me demande de donner la taille en octet de structure.
typedef struct matiere{
char nom;
float coef;
}matiere;
voila la structure dont je dois calculer la taille, selon moi un char est codé sur 1 octet et un float sur 4 octets donc apriori la taille de la structure serai de 5 octets.
Or en faisant printf("%d", sizeof(matiere)), le résultat est 8.
Je ne comprend pas le résultat et donc ai du mal a l'interpréter.
En espérant m'être fait comprendre, j'espère que vous pourrez m'aider.
cordialement
jehutyy
A voir également:
- Codage du float et structure
- Codage ascii - Guide
- Codage binaire - Guide
- Logiciel calcul structure bois gratuit - Télécharger - Architecture & Déco
- Structure d'un rapport de stage - Guide
- Application codage - Guide
1 réponse
Salut.
En ISO C une structure n'a pas de taille définie, a taille dépendra de l'implementation du compilateur et d'options de compilation.
Sa taille minimum est bien entendu celle de ses membres. Mais ensuite, pour des raisons de rapidité, les données sont alignés en mémoire selon une alternance de 4 octet je crois (je n'ai pas compris exactement la raison profonde du bazard). L'alignement veux dire que le compilateur laisse de la place de libre entre ta première variable et la seconde. C'est pour ça qu'on recommande de mettre dans les structures en premier les variables les plus grosses et de finir par les plus petites.
Pour reprendre ton exemple, il y a 3 octets d'inutiles entre nom et coef.
Par contre, tu empiles les petites variables, ainsi struct{char a[4];float coef;} devrait aussi valoir 8. Si tu passes à a[5] la taille devrait être de 12 etc.
En espérant avoir été claire. Sinon, je te passerai la référence du livre électronique où j'ai lu cette explication.
En ISO C une structure n'a pas de taille définie, a taille dépendra de l'implementation du compilateur et d'options de compilation.
Sa taille minimum est bien entendu celle de ses membres. Mais ensuite, pour des raisons de rapidité, les données sont alignés en mémoire selon une alternance de 4 octet je crois (je n'ai pas compris exactement la raison profonde du bazard). L'alignement veux dire que le compilateur laisse de la place de libre entre ta première variable et la seconde. C'est pour ça qu'on recommande de mettre dans les structures en premier les variables les plus grosses et de finir par les plus petites.
Pour reprendre ton exemple, il y a 3 octets d'inutiles entre nom et coef.
Par contre, tu empiles les petites variables, ainsi struct{char a[4];float coef;} devrait aussi valoir 8. Si tu passes à a[5] la taille devrait être de 12 etc.
En espérant avoir été claire. Sinon, je te passerai la référence du livre électronique où j'ai lu cette explication.
C'est que les processeurs ont aujourd'hui des bus de données de plus de 8 bits, par exemple 32 bits (=4 octets)
Je raisonne sur une machine en little endian ( poids faible à l'adresse faible)
Si tu as une structure
char a
int b;
sans 'laisser de trou' entre les deux, pour aller lire b, le processeur va être obligé de faire 2 lectures. Car les accès ne se font pas par octet, mais par paquets de 4 octets.
Si b est 'bien cadré',la première lecture donnera b et 3 octets de a, la seconde le dernier octet de a.De plus, le processeur sera obligé de décaler les bits car lors de la 1ère lecture, il faudra ranger les bits 8 à 31 du bus de données dans les bits 0 à 23 du processeur, et idem (enfin, avec d'autres bits) pour la seconde lecture.
Un bon contournement de ce problème consiste donc à faire des enregistrements compactés, pour le gain en espace, mais dans lequel on place tous les dwords en 1er, les words ensuite puis les octets. Les enregistrements devant idéalement être alignés tout de même entre eux.
C'est ce que je croyais avoir dir, à ceci près que j'ignorais que le problème ne se posait que pour la mémoire cache. Je ne comprends pas pourquoi il ne se pose pas pour la mémoire externe, mais j'avoue avoir de compétences très limitées sur le sujet. Mon éducation dans ce domaine remonte à un stage sur le 8086, sans mémoire cache et pas capable de lire un mot de 16 bits cadré sur une adresse impaire (si ma mémoire ne me trahit pas...)
Merci pour la précision
Quant à l'accés à la mémoire externe, il se fait sur 64 bits ce qui limite le problème.