IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Retour de Sizeof() incorrect


Sujet :

C++

  1. #1
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Par défaut Retour de Sizeof() incorrect
    Bonjour, j'ai une petite question.
    J'ai créé une classe Bloc dans mon programme afin de stocker des chaines sous forme de blocs de taille fixe dans un fichier binaire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #include <iostream>
     
    using namespace std;
     
    typedef char chaine[10];
    typedef unsigned int Uint;
     
    class Bloc {
    	public:
    		Bloc () {}
     
    		private:
    			chaine chaines[5];
    			Uint suivant, nbMots;
    };
     
    int main (int argc, char ** argv) {
    	cout << "Taille bloc = " << sizeof(Bloc) << endl;
    	return 0;
    }
    Le programme une fois lancé me donne la taille de Bloc à 60 octets alors que la taille réelle est 5*10+4+4 = 58. D'où peut venir cette différence de 2 octets ?

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    De l'alignement.

  3. #3
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Par défaut
    Tu n'aurai pas un lien qui expliquerait ce problème en détail ?

  4. #4
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Tiens.
    J'avais complètement oublié ce détail dans le récent échange avec dj.motte au sujet de l'inadéquaton de std::string pour réaliser des sérialisations bourrines.
    C'est fou tout ce quoi on ne pense plus un fois que l'on arrête de bidouiller.

    @ poof65: à la première fonction virtuelle tu auras également d'autres surprises.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  5. #5
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Par défaut
    Personne n'a une explication plus claire ?

  6. #6
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    En deux mots :
    - L'alignement : Il est plus rapide pour certains compilateur de gérer des adresses mémoires multiple de 2, ou de 4, ou de... Donc quand tu déclares une structure, le compilateur y met des trous pour accélérer le traitements.
    - Les fonctions virtuelles : A partir d'une moment où une classe a des fonctions virtuelles, il y a besoin de données supplémentaires pour gérer ce mécanisme (typiquement un pointeur), qui est donc ajouté silencieusement à la classe.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  7. #7
    Expert confirmé
    Avatar de Thierry Chappuis
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Mai 2005
    Messages
    3 499
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Suisse

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Mai 2005
    Messages : 3 499
    Par défaut
    Citation Envoyé par poof65
    Personne n'a une explication plus claire ?
    L'alignement est pratiqué par certains processeurs pour optimiser l'accès aux variables stockées en mémoire en alignant par exemples les entiers de type int 32 bits (dépend de l'implantation) sur des adresses multiples de 4, les short 16 bits (dépend de l'implantations) sur des adresses multiples de 2, etc.

    Ainsi, si on a une structure comprenant un entier de type int, et un caractère et un autre int, c'est à dire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct UneStruct {
        int nombre1;
        char c;
        int nombre2;
    };
    Il est possible que la taille de cette structure soit de 4 octets + 4 octets + 4 octets = 12 octets. Mais tout cela est naturellement dépendant de l'implantation.

    Thierry
    "The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
    "If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow

    FAQ-Python FAQ-C FAQ-C++

    +

  8. #8
    Expert confirmé
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 296
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 296
    Par défaut
    Il y a même des proc qui plantent nos programmes quand on cherche à faire des accès non alignés sur des zones de données.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  9. #9
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Par défaut
    Merci à tous pour ces informations, problème résolu.
    J'avais déjà entendu ce terme "alignement" dans les problèmes qu'on pouvait rencontrer en C en déclarant des champs de bits dans des structs mais je ne pensais pas que ça serait la même chose avec les classes.

  10. #10
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par poof65
    Merci à tous pour ces informations, problème résolu.
    J'avais déjà entendu ce terme "alignement" dans les problèmes qu'on pouvait rencontrer en C en déclarant des champs de bits dans des structs mais je ne pensais pas que ça serait la même chose avec les classes.
    Il n'y a, à vrai dire, aucune raison pour que le raisonnement ne s'applique pas aux classes...

    La notion de classe et celle de strucutre sont en effet très semblable en C++...

    Seuls quelques détails dont, entre autre, la visibilité par défaut des membres (et fonctions membres) diffèrent entre les deux, mais, dans l'ensemble, les classes et les structures réagissent exactement de la meme manière...

    Et comme, les strucutres en C++ viennent tout droit des structures en C (avec, juste l'ajout de quelques fonctionnalités)... le raisonnement suivi pour les structures en C peut etre élargi pour les structures (et donc les classes) en C++
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Erreur Retour d'accord Paypal incorrect
    Par centaure-net dans le forum WebDev
    Réponses: 1
    Dernier message: 15/01/2016, 04h07
  2. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  3. [Formule]Retour incorrect avec BDSOMME
    Par orangemeca dans le forum Excel
    Réponses: 2
    Dernier message: 08/05/2007, 19h48
  4. retour d'ArrayList incorrect
    Par johnkhm dans le forum Collection et Stream
    Réponses: 9
    Dernier message: 09/01/2007, 18h32
  5. URGENT: retour de string
    Par Pinggui dans le forum CORBA
    Réponses: 4
    Dernier message: 15/07/2002, 09h47

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo