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

Langage C++ Discussion :

sizeof(rien_du_tout) == 1


Sujet :

Langage C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut sizeof(rien_du_tout) == 1
    Je ne m'étais jamais posé la question de savoir combien de place une structure (ou classe) dépourvue d'attribut prenait de place en mémoire. Spontanément j'aurais dit "zéro" si on m'avait posé la question sans prendre le temps de vérifier ou réfléchir.

    Ainsi donc les traits, par exemple, ou bien d'autre classes de la STL ne servant qu'à faire du "typage", sont vides et pourtant leur sizeof() est égal à 1.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct rien_du_tout { };
    cout << "résultat: " << sizeof(rien_du_tout) << endl;
     
    résultat: 1
    C'est curieux.
    Mais par ailleurs, si sizeof()==0, comment instantier un objet de rien_du_tout ? Comment imaginer le comportement d'un pointeur vers un emplacement en mémoire d'une instance de rien_du_tout ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    struct un_peu: rien_du_tout { char c; };
    cout << "résultat: " << sizeof(un_peu) << endl;
     
    résultat: 1
    Bon, soit...

    Mais ça m'embête un peu. J'aimerais quand même que sizeof(rien_du_tout)==0.
    Prenons par exemple le cas d'un list< vector<int> > ou d'un list< string > où on consomme de la mémoire "en trop" pour rien. En cause std::allocator qui est une classe "vide" (sous Visual en tout cas) mais qui est "instanciée" dans chaque vector, dans chaque string aussi (et dans tous les conteneurs en général). Et pour peu que l'on fasse un alignement en mémoire (c'est le cas par défaut) on perd 4 octets à chaque instance. C'est cher payé pour "rien".

    Pour une fois on aimerait bien que std::allocator soit instanciée une bonne fois pour toute dans une variable globale, d'autant plus que les allocators autre que le standard ne sont pas légions. Dans Loki je crois qu'il y a un SmallObjectAllocator, c'est le seul autre que je connaisse.
    J'ai aussi déjà posé la question sur le forum afin de savoir si quelqu'un s'était lancé dans l'écriture d'un allocator, ou les régles à respecter pour le faire. Sans beaucoup de succès...

    Bref, pourquoi sizeof(rien_du_tout)==1 et non pas 0 ?

  2. #2
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  3. #3
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Tient, j'avais posé la même question il y a 1 an : Taille des classes, question à 0,01€
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  4. #4
    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
    Si tu hérites d'une classe vide, alors ça n'augmente pas la taille sur la plupart des compilateurs.
    C'est comme ça que les conteneurs font pour les allocateurs.

    Voir aussi boost::compressed_pair.

  5. #5
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Merci.
    Je me doutais bien que la réponse était "simplement" dans la distinction d'une instance d'une autre (surtout dans un tableau).

    Après réflexion, je me demande si l'argumentation n'est pas un peu faible car finalement l'instantiation d'un contenu vide n'a pas beaucoup de sens. Enfin si, elle a du sens, ce qui n'en a pas c'est de lui attribuer de l'espace mémoire. Ainsi sous le simple prétexte que, par impossible, un programmeur chercherait à distinguer une instance vide d'une autre (ça vous arrive souvent, vous ?), allez, hop, un peu de mémoire inutile consommée pour tout le monde.

    Je préfèrerais que sizeof(rien_du_tout)==0. Et, le cas échéant, le compilateur pourrait générer un warning (ou même une erreur) lorsque le code cherche à repérer l'espace mémoire que l'instance occuperait.
    Je ne verrais donc pas d'inconvénient à ce que le compilateur refuse des écritures comme celles-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<rien_du_tout> v;
    rien_du_tout arr[25];

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Si sizeof(rien_du_tout)==0, la question que je me poserai c'est quel est l'intérêt de rien_du_tout, puisque ce n'est rien du tout, autan ne rien utiliser du tout ?

Discussions similaires

  1. sizeof() d'une structure
    Par tut dans le forum MFC
    Réponses: 12
    Dernier message: 29/08/2006, 18h21
  2. utilisation de sizeof
    Par Mokhtar BEN MESSAOUD dans le forum C
    Réponses: 13
    Dernier message: 02/12/2005, 18h16
  3. Sizeof d'un pointeur sur char ...
    Par Mike888 dans le forum C
    Réponses: 8
    Dernier message: 03/11/2005, 13h04
  4. sizeof
    Par drKzs dans le forum C
    Réponses: 6
    Dernier message: 04/10/2003, 23h48
  5. Erreurs (sizeof)
    Par deepfear dans le forum C
    Réponses: 13
    Dernier message: 25/09/2003, 13h56

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