Taille d'une structure en mémoire

Signaler
Messages postés
7
Date d'inscription
mercredi 6 octobre 2004
Statut
Membre
Dernière intervention
22 juin 2005
-
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
-
Bonjour



J'ai un petit problème en c++ (sous VC++6). Je défini une structure du style :



typedef struct

{

__int64 B;

char A;

} MyStruct;



Et la fonction sizeof(MyStruct) me renvoie toujours 16 octets, alors
que si je compte bien, cela devrait etre 8 + 1. Visiblement, il compte
le "char" comme 8 octets. Comment cela se fait-il, et comment peut-on
avoir la taille correcte ?



Merci d'avance

6 réponses

Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Ceci est du à l'alignement des données en mémoire pour que le processeur accède à une variable en 1 cycle.
- les variables d'un octet n'ont pas besoin d'être alignées.
- les variables de 2 octets doivent être situées à des adresses multiple de 2
- les variables de 4 octets doivent être situées à des adresses multiple de 4
...
Dans une structure, le compilo fait en sorte que cela soit respecté. Avec les options par défaut sous VC6, l'alignement est sur 8 octets, toutes les structures seront donc multiple de cette valeur. Tu peux modifier cette valeur dans les options du projet mais mettre autre chaose que 4 ou 8 peut réduire les performances lors de l'accès aux structures.

dans tu structure, tu as bien 8 octets+1 octet mais tu as en plus 7 octets inutilisé pour que la variable suivante en mémoire soit bien alignée.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
Ton compilo aligne les donnees sur 8 (a ta place).
Il a donc ajouté char dummy[15] dans ta structure et c'est heureux comme situation.

ciao...
BruNews, MVP VC++
Messages postés
7
Date d'inscription
mercredi 6 octobre 2004
Statut
Membre
Dernière intervention
22 juin 2005

Si je comprends bien, il n'y a pas de solution : en fait, avec un
"write", je voulais juste ecrire le contenu de la structure dans un
fichier, mais il rajoute les 16-9=7 octets en plus. Je n'ai pas d'autre
choix que de le faire champ par champ ?
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
Si tu veux vraiment que ta structure fasse 7 octets tu peux faire :
#include
typedef struct
{
__int64 B;
char A;
} MyStruct;
#include

Cependant si tu ne dois pas suivre un format précis pour écrire dans le fichier je te conseille de ne pas jouer avec l'alignement.
Messages postés
2070
Date d'inscription
mardi 22 avril 2003
Statut
Membre
Dernière intervention
3 juillet 2006
8
La structure fera bien sûr 9 octets et non pas 7.
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
29
#pragma pack(1)
typedef struct {
__int64 B;
char A;
} MyStruct;

#pragma pack()

tu auras bien la somme des tailles des membres mais comme dit par ymca2003, évite ce genre de choses absolument.

ciao...
BruNews, MVP VC++