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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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++

    +

+ 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