Taille variables dans une class/struct [Résolu]

Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012
- - Dernière réponse : 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
Afficher la suite 

4 réponses

Meilleure réponse
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
10 juin 2019
85
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 127 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3834
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
10 juin 2019
85
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 127 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012
0
Merci
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
Commenter la réponse de cs_LA_Tupac
Messages postés
305
Date d'inscription
jeudi 29 avril 2004
Statut
Membre
Dernière intervention
18 janvier 2012
0
Merci
Ok tout est clair maintenant 4*8=32
Merci encore pour ces explications pragmatiques

longues vies aux pingouins dans l'informatique
Commenter la réponse de cs_LA_Tupac