Taille variables dans une class/struct

Résolu
cs_LA_Tupac Messages postés 305 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 18 janvier 2012 - 9 juin 2011 à 17:48
cs_LA_Tupac Messages postés 305 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 18 janvier 2012 - 10 juin 2011 à 10:07
Salut à tous. Je me penche sur la taille des données car je fais des écritures binaires d'objets à taille variable dans des fichiers.
En faisant des test avec des sizeof(), je me suis rendu compte que les class prennent au minimum 1 octet même si elles sont vides. Si j'y ajoute une variable de 4 octets, alors la class fait 4 octets. Jusque ici, je comprends pourquoi.
Mais ce qui me chiffone, c'est que si cette foi j'y ajoute un tableau de char à taille fixe, la taille change de 4 en 4. Autrement dit, un char[4] fait la même taille qu'un char[5] ou un char[6] ou un char[7].
Si on pouvait m'éclairer.. Merci

4 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 juin 2011 à 19:51
C'est dû à l'alignement mémoire.

#include 

class Empty
{
};

class A
{
  int i;
  char c;
  char tab[4];
};

class APacked
{
  int i;
  char c;
  char tab[4];
} __attribute__((packed));

class A2
{
  int i;
  char c;
  char tab[5];
};

class A2Packed
{
  int i;
  char c;
  char tab[5];
} __attribute__((packed));


int main()
{
  std::cout << sizeof (Empty) << std::endl
    << sizeof (A) << std::endl
    << sizeof (APacked) << std::endl
    << sizeof (A2) << std::endl
    << sizeof (A2Packed) << std::endl;

  return 0;
}


Sortie:

1
12
9
12
10


________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
9 juin 2011 à 23:46
Pour vulgariser, c'est une question d'architecture. (Pas lié à un langage).
Bien détaillé ici:
http://en.wikipedia.org/wiki/Data_structure_alignment

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
3
cs_LA_Tupac Messages postés 305 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 18 janvier 2012 1
9 juin 2011 à 23:29
Ok dac! c'est aligné sur 4 octets si j'ai bien compris. Et l'__attribute__((packed)) spécifie d'aligner à l'octet près..
Du coup question subsidiare: pourquoi cet alignement? rapidité d'accès?

Merci beaucoup Pingu
0
cs_LA_Tupac Messages postés 305 Date d'inscription jeudi 29 avril 2004 Statut Membre Dernière intervention 18 janvier 2012 1
10 juin 2011 à 10:07
Ok tout est clair maintenant 4*8=32
Merci encore pour ces explications pragmatiques

longues vies aux pingouins dans l'informatique
0
Rejoignez-nous