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 :

Objets et taille mémoire


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 34
    Par défaut Objets et taille mémoire
    Bonjour,

    Je me pose une question depuis quelque temps à propos de la taille des objets. Je vous propose mon programme source ici:

    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
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    /* Début du source */
     
    class carac
    {
    	char c;
    };
     
    class petit
    {
    	short int p;
    };
     
    class grand
    {
    	long int g;
    };
     
    class combi1
    {
    	char c;
    	short int p;
    };
     
    class combi2
    {
    	short int p;
    	long int g;
    };
     
     
    int main(int argc, char* argv[])
    {
    	carac ob1;
    	petit ob2;
    	grand ob3;
    	combi1 ob4;
    	combi2 ob5;
     
    	cout<<sizeof(ob1)<<"\t"<<sizeof(ob2)<<"\t";
    	cout<<sizeof(ob3)<<"\t"<<sizeof(ob4)<<"\t";
    	cout<<sizeof(ob5);
     
    	return 0;
    }
     
    /* Fin du source */
    Vous l'avez compris, ce programme sert à vérifier la taille occupée en mémoire par différentes instances de classes simples.

    Le résultat est étonnant: autant les objets 1, 2 et 3 occupent une taille respective de 1, 2 et 4 octets, ce qui correspond bien à la taille des attributs qui les constituent, autant les objets 4 et 5 ne semblent pas suivre la même logique: j'attendais la valeur 3 pour l'objet 4 (1 octet pour le char + 2 pour le short), or sizeof renvoie la valeur 4. De même pour l'objet 5, on obtient une taille de 8 octets là où j'en attendait 6.

    Je suppose que cela suit une certaine logique au niveau de la réservation mémoire, mais je n'en ai jamais entendu parler jusqu'ici. Est-ce que quelqu'un en saurait un peu plus et pourrait me fournir une explication?

    Par avance merci.

  2. #2
    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
    Pour plus d'info, recherche le terme padding.

    En gros, il est plus simple pour un processeur d'avoir certains types de données qui commencent à des adresses multiple de 2, ou de 4, donc il a besoin d'ajouter des trous dans les structures.
    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.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 34
    Par défaut
    Ok, je comprends mieux la raison maintenant. Effectivement, en recherchant les termes padding et sizeof, je suis arrivé sur une page d'aide de la MSDN (aide de Microsoft) où j'ai pu lire:

    "When applied to a structure type or variable, sizeof returns the actual size, which may include padding bytes inserted for alignment."

    Donc le terme "alignment" doit correspondre au principe d'alignement sur des adresses multiples de 4 que tu énonces.

    Problème résolu. Merci!

  4. #4
    Expert confirmé

    Homme Profil pro
    pdg
    Inscrit en
    Juin 2003
    Messages
    5 756
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : pdg

    Informations forums :
    Inscription : Juin 2003
    Messages : 5 756
    Billets dans le blog
    3
    Par défaut
    Cherche aussi des infos sur #pragma pack.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    34
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2005
    Messages : 34
    Par défaut
    En effet, lorsque je fait procéder ma déclaration de classes par:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    #pragma pack(1)
    je retrouve bien les valeurs attendues, à l'octet prêt.

    Encore merci pour vos réponses!

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

Discussions similaires

  1. [POO] taille mémoire d'un objet dérivant de la classe handle
    Par oodbae_adriano dans le forum MATLAB
    Réponses: 0
    Dernier message: 29/08/2011, 18h01
  2. Réponses: 3
    Dernier message: 13/04/2010, 13h38
  3. Pb Taille mémoire d'un objet TStrings ?
    Par colorid dans le forum Delphi
    Réponses: 8
    Dernier message: 05/07/2007, 11h52
  4. Réponses: 3
    Dernier message: 28/06/2005, 09h07
  5. [JVM] Connaitre la taille mémoire utilisé par les dif classe
    Par sur_uix dans le forum Général Java
    Réponses: 4
    Dernier message: 18/09/2003, 09h17

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